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

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

答案

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

我有一个 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,因此上面讨论的问题可能有一些更新。幸运的是,它可以正常工作,并希望它将保持这种状态。

如果您在行中具有 NULL 值,则多列唯一索引在 MySQL 中不起作用,因为 MySQL 将 NULL 视为唯一值,并且至少当前在多列索引中没有逻辑可解决。是的,这种行为是疯狂的,因为它限制了多列索引的许多合法应用程序,但事实就是如此... 到目前为止,它是一个已在 MySQL 上标有 “无法修复” 的错误错误跟踪...

你尝试过这个吗?

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

这适用于 MySQL 5.5.32 版

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

MySql 5 或更高版本的行为如下(我刚刚测试过):

  • 您可以定义涉及可空列的唯一约束。假设您定义唯一的约束(A,B),其中 A 不可为空,而 B 为
  • 在评估这种约束时,您可以拥有(A,null)任意多次(相同的 A 值!)
  • 您只能有一对(A,不能为空 B)

示例:PRODUCT_NAME,PRODUCT_VERSION“杯子”,空 “杯子”,空 “酒”,1

现在,如果您再次尝试插入(“葡萄酒” 1),则会报告违反约束的情况。

您可以通过phpMyAdmin添加多列唯一索引。 (我在 4.0.4 版中进行了测试)

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

我这样做是这样的:

CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);

我对唯一index_name约定是TableName_Column1_Column2_Column3_uindex

要添加唯一索引,需要执行以下操作:

1)table_name
2)index_name
3)您要在其上添加索引的列

ALTER TABLE  `tablename` 
ADD UNIQUE index-name
(`column1` ,`column2`,`column3`,...,`columnN`);

在您的情况下,我们可以如下创建唯一索引:

ALTER TABLE `votes`ADD 
UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);

如果您想避免将来重复。创建另一个列,例如 id2。

UPDATE tablename SET id2 = id;

现在,在两列上添加唯一性:

alter table tablename add unique index(columnname, id2);