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

Niy*_*yaz 835 mysql composite-key unique-constraint database-table

我有一张桌子:

table votes (
    id,
    user,
    email,
    address,
    primary key(id),
);
Run Code Online (Sandbox Code Playgroud)

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

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

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

jon*_*ohn 1383

ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
Run Code Online (Sandbox Code Playgroud)

  • 对于那些使用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认同)
  • @wasim null 被认为是“缺失的未知值”,这意味着 MySQL 不认为两个 null 是相同的。无法使用唯一索引来强制执行此操作。您可以使用 BEFORE INSERT / BEFORE UPDATE 触发器来完成它,但不能使用唯一索引。 (2认同)

Fro*_*dik 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`)
);
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 49

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

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

Eri*_*ick 23

你试过这个吗?

UNIQUE KEY `thekey` (`user`,`email`,`address`)
Run Code Online (Sandbox Code Playgroud)


riz*_*zon 11

这适用于mysql版本5.5.32

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);
Run Code Online (Sandbox Code Playgroud)

  • 它似乎在列名上没有单引号的情况下工作。 (2认同)

小智 6

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

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


Cri*_*iza 6

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

  • 您可以定义涉及可空列的唯一约束.假设你定义一个唯一的约束(A,B),其中A不可为空而B是
  • 在评估这样的约束时,你可以多次(A,null)(相同的A值!)
  • 你只能有一个(A,非空B)对

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

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


gan*_*ivs 6

这个教程对我有用

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);
Run Code Online (Sandbox Code Playgroud)

https://www.mysqltutorial.org/mysql-unique-constraint/


Sam*_*yek 5

我这样做:

CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);
Run Code Online (Sandbox Code Playgroud)

我对独特的约定index_nameTableName_Column1_Column2_Column3_uindex.