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

How do I specify unique constraint for multiple columns in MySQL?

我有一张桌子。

ZZU1-12308012309型

现在,我想把用户栏、电子邮件栏、地址栏统一起来。

如何在MySQL中执行此操作?

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


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


我有一个mysql表:

1
2
3
4
5
6
7
8
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`)
);

唯一键工作正常,它允许多个空行的id_box_元素和id_路由器。

我运行的是MySQL5.1.42,所以可能上面讨论的问题有一些更新。幸运的是,它起作用了,希望它能一直这样。


如果行中有一个空值,那么多列唯一索引在MySQL中不起作用,因为MySQL将空值视为唯一值,并且至少当前没有在多列索引中处理它的逻辑。是的,这种行为是疯狂的,因为它限制了许多合法的多列索引应用,但它就是这样…到目前为止,这是一个已经在mysql bug轨道上标记了"will not fix"的bug…


你试过这个吗?

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


这适用于MySQL5.5.32版本

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


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

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


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

  • 可以定义涉及可为空列的唯一约束。假设您定义了一个唯一的约束(a,b),其中a不可以为空,b是
  • 当计算这样的约束时,您可以根据需要多次使用(空)(相同的值!)
  • 您只能有一对(A,而不是空B)

例子:产品名称,产品版本"玻璃",空"玻璃",空"葡萄酒",1

现在,如果您再次尝试插入("wine"1),它将报告违反约束的情况。希望这有帮助


我是这样做的:

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

我对一个独特的index_name的约定是TableName_Column1_Column2_Column3_uindex


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

1)表名2)索引名称3)要添加索引的列

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

在您的案例中,我们可以创建以下唯一索引:

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

如果你以后想避免重复的话。创建另一列,比如ID2。

1
UPDATE tablename SET id2 = id;

现在在两列中添加唯一:

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

如果要在MySQL中创建表,请使用以下命令:

1
2
3
4
5
6
7
8
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)
);