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

我有一张桌子:

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

现在我想使列用户名邮箱地址唯一(一起)。

如何在MySQL中执行此操作?

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

637529 次浏览

要添加唯一约束,您需要使用两个组件:

ALTER TABLE-更改表模式,

ADD UNIQUE-添加唯一约束。

然后,您可以使用格式'name'('column1', 'column2'...)定义新的唯一密钥

因此,对于您的特定问题,您可以使用此命令:

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

你试过这个吗?

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

如果您在行中有一个NULL值,则多列唯一索引在MySQL中不起作用,因为MySQL将NULL视为唯一值,并且至少目前没有逻辑可以在多列索引中解决它。是的,这种行为是疯狂的,因为它限制了多列索引的许多合法应用程序,但它就是这样…到目前为止,它是一个bug,在MySQLbug上被标记为“不会修复”。

我有一个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 `my_uniq_id` (`id_box_elements`,`id_router`));

和唯一的关键工作就像预期的一样,它允许多个NULL行的id_box_elements和id_router。

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

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

UPDATE tablename SET id2 = id;

现在在两列上添加唯一值:

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

这适用于mysql版本5.5.32

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

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

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

对于添加唯一索引,需要以下内容:

1)table_name
index_name
3)要添加索引的列

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

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

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

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

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

示例:PRODUCT_NAME,PRODUCT_VERSION“玻璃”,空“玻璃”,空葡萄酒,1

现在,如果您再次尝试插入('Wine'1),它将报告违反约束希望对你有帮助

我是这样做的:

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

我对唯一index_name的约定是TableName_Column1_Column2_Column3_uindex

如果您在mysql中创建表,请使用以下内容:

create table package_template_mapping (mapping_id  int(10) not null auto_increment  ,template_id int(10) NOT NULL ,package_id  int(10) NOT NULL ,remark      varchar(100),primary key (mapping_id) ,UNIQUE KEY template_fun_id (template_id , package_id));

首先摆脱现有的重复

delete a from votes as a, votes as b where a.id < b.idand a.user <=> b.user and a.email <=> b.emailand a.address <=> b.address;

然后添加唯一约束

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

验证约束

SHOW CREATE TABLE votes;

请注意,如果其中任何一个具有空值,则用户、电子邮件、地址将被视为唯一。

对于PostgreSQL…它不适合我的索引;它给了我一个错误,所以我这样做:

alter table table_nameadd unique(column_name_1,column_name_2);

PostgreSQL给唯一索引起了自己的名字。我想你可以在表的选项中更改索引的名称,如果需要更改…

本教程适用于我

ALTER TABLE table_nameADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);

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