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

时间:2009-03-11 19:12:32

标签: mysql unique-constraint composite-key database-table

我有一张桌子:

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

现在,我想将用户,电子邮件,地址列设为唯一(一起)。

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

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

14 个答案:

答案 0 :(得分:1315)

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

答案 1 :(得分:210)

我有一个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,所以可能在上面讨论的问题上有一些更新。幸运的是它有效,希望它能保持这种状态。

答案 2 :(得分:45)

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

答案 3 :(得分:23)

你试过这个吗?

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

答案 4 :(得分:11)

这适用于mysql版本5.5.32

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

答案 5 :(得分:6)

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

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

答案 6 :(得分:5)

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

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

实施例: PRODUCT_NAME,PRODUCT_VERSION ' glass',null ' glass',null ' wine',1

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

答案 7 :(得分:2)

我这样做是这样的:

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

我对唯一的index_name的约定是TableName_Column1_Column2_Column3_uindex

答案 8 :(得分:1)

如果你想在将来避免重复。创建另一列说id2。

UPDATE tablename SET id2 = id;

现在在两列上添加唯一:

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

答案 9 :(得分:1)

需要添加以下唯一索引:

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`);

答案 10 :(得分:1)

本教程对我有用

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

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

答案 11 :(得分:0)

如果要在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)
);

答案 12 :(得分:0)

首先清除现有重复项

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

然后添加唯一约束

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

验证约束

SHOW CREATE TABLE votes;

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

答案 13 :(得分:0)

对于PostgreSQL ... 索引对我来说不起作用;它给了我一个错误,所以我这样做了:

alter table table_name
add unique(column_name_1,column_name_2);

PostgreSQL给唯一索引赋予了自己的名字。我想您可以在表的选项中更改索引的名称,如果需要更改的话...