当前位置:  开发笔记 > 编程语言 > 正文

如何为MySQL中的多列指定唯一约束?

如何解决《如何为MySQL中的多列指定唯一约束?》经验,为你挑选了7个好方法。

我有一张桌子:

table votes (
    id,
    user,
    email,
    address,
    primary key(id),
);

现在我想使列用户,电子邮件,地址唯一(一起).

我如何在MySql中执行此操作?

当然这个例子只是......一个例子.所以请不要担心语义.

jonstjohn.. 1383

ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);

对于那些使用MySQL工作台的人:转到索引选项卡并选择UNIQUE作为您的类型.为索引命名并检查"索引列"部分下的相应列 (86认同)

这是否适用于INSERT语句的ON DUPLICATE KEY子句?也就是说,如果我试图插入与另一行的用户/电子邮件/地址值冲突的行,INSERT是否会执行ON DUPLICATE KEY子句指定的操作? (31认同)

加里,三人的组合将是独一无二的. (18认同)

像我一样,如果有其他人从搜索引擎中找到这个......并且回答Clizzin关于ON DUPLICATE KEY是否可以使用复合键的问题 - 它绝对会,但是它需要对语法进行一些小的调整.请参阅http://stackoverflow.com/questions/9537710/is-there-a-way-to-use-on-duplicate-key-to-update-all-that-i-wanted-to-insert (9认同)

这样三种组合会是独一无二的吗?或者所有单独的三列都是独一无二的? (4认同)

如何使它即使使用NULL值也能工作。如果我们插入两个具有NULL值的相同行,则此行不起作用... (2认同)


Frodik.. 223

我有一个MySQL表:

CREATE TABLE `content_html` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_box_elements` int(11) DEFAULT NULL,
  `id_router` int(11) DEFAULT NULL,
  `content` mediumtext COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_box_elements` (`id_box_elements`,`id_router`)
);

并且UNIQUE KEY的工作方式与预期的一样,它允许id_box_elements和id_router的多个NULL行.

我正在运行MySQL 5.1.42,所以可能在上面讨论的问题上有一些更新.幸运的是它有效,希望它能保持这种状态.



1> jonstjohn..:
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);


对于那些使用MySQL工作台的人:转到索引选项卡并选择UNIQUE作为您的类型.为索引命名并检查"索引列"部分下的相应列
这是否适用于INSERT语句的ON DUPLICATE KEY子句?也就是说,如果我试图插入与另一行的用户/电子邮件/地址值冲突的行,INSERT是否会执行ON DUPLICATE KEY子句指定的操作?
加里,三人的组合将是独一无二的.
像我一样,如果有其他人从搜索引擎中找到这个......并且回答Clizzin关于ON DUPLICATE KEY是否可以使用复合键的问题 - 它绝对会,但是它需要对语法进行一些小的调整.请参阅http://stackoverflow.com/questions/9537710/is-there-a-way-to-use-on-duplicate-key-to-update-all-that-i-wanted-to-insert
这样三种组合会是独一无二的吗?或者所有单独的三列都是独一无二的?
如何使它即使使用NULL值也能工作。如果我们插入两个具有NULL值的相同行,则此行不起作用...

2> Frodik..:

我有一个MySQL表:

CREATE TABLE `content_html` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_box_elements` int(11) DEFAULT NULL,
  `id_router` int(11) DEFAULT NULL,
  `content` mediumtext COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_box_elements` (`id_box_elements`,`id_router`)
);

并且UNIQUE KEY的工作方式与预期的一样,它允许id_box_elements和id_router的多个NULL行.

我正在运行MySQL 5.1.42,所以可能在上面讨论的问题上有一些更新.幸运的是它有效,希望它能保持这种状态.


我想标记这个答案,因为它确实向您展示了如何创建一个具有唯一索引的新表,其中jonstjohn上面的答案告诉您如何更新现有表.他们做同样的事情,只是取决于你是创建一个新表还是更新现有表.:)
它是Adminer(www.adminer.org)的输出,它自动插入这些反引号,因此碰撞用作列名的mysql关键字没有问题.
什么是所有的反引号,它们是否有用的目的?

3> 小智..:

如果行中有NULL值,则多列唯一索引在MySQL中不起作用,因为MySQL将NULL视为唯一值,并且至少当前没有逻辑可以在多列索引中解决它.是的,这种行为是疯狂的,因为它限制了很多合法的多列索引应用程序,但它就是这样......到目前为止,这是一个在MySQL上标记为"无法修复"的错误错误轨道...


两点澄清:1)这种行为并不适用于"ENGINE BDB",而且,2)这是*记录*行为,尽管恕我直言,但没有明确记录,因为它有多么令人惊讶/不愉快.有关讨论,请参阅MySQL错误25544 http://bugs.mysql.com/bug.php?id=25544.
这不是答案.它应该是对原始问题的评论.
感谢NULL提示,解决了我遇到的问题...我想我将使用哈希校验和

4> Erick..:

你试过这个吗?

UNIQUE KEY `thekey` (`user`,`email`,`address`)



5> rizon..:

这适用于mysql版本5.5.32

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);



6> 小智..:

您可以通过phpMyAdmin添加多列唯一索引.(我在4.0.4版本中测试过)

导航到目标表的结构页面.向其中一列添加唯一索引.展开结构页面底部的" 索引"列表,以查看刚刚添加的唯一索引.单击编辑图标,然后在以下对话框中,您可以向该唯一索引添加其他列.



7> Cristian Bot..:

MySql 5或更高版本的行为与此类似(我刚刚测试过):

您可以定义涉及可空列的唯一约束.假设你定义一个唯一的约束(A,B),其中A不可为空而B是

在评估这样的约束时,你可以多次(A,null)(相同的A值!)

你只能有一个(A,非空B)对

示例:PRODUCT_NAME,PRODUCT_VERSION'glass',null'glass',null'wine',1

现在,如果你再次尝试插入('wine'1),它将报告约束违规希望这会有所帮助

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有