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

如何为MySQL中的多个列指定唯一约束?,mysql,unique-constraint,composite-key,database-table,Mysql,Unique Constraint,Composite Key,Database Table,我有一张桌子: table votes ( id, user, email, address, primary key(id), ); 现在我想让用户、电子邮件、地址等列(一起)唯一 如何在MySql中实现这一点 当然,这个例子只是。。。举个例子。因此,请不要担心语义。要添加唯一约束,需要使用两个组件: ALTER TABLE-要更改表格架构,请执行以下操作: 添加唯一约束-添加唯一约束 然后,您可以使用格式'name'('column1'、'colum

我有一张桌子:

table votes (
    id,
    user,
    email,
    address,
    primary key(id),
);
现在我想让用户、电子邮件、地址等列(一起)唯一

如何在MySql中实现这一点


当然,这个例子只是。。。举个例子。因此,请不要担心语义。

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

ALTER TABLE
-要更改表格架构,请执行以下操作:

添加唯一约束
-添加唯一约束

然后,您可以使用格式
'name'('column1'、'column2'…)

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

ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
你试过这个吗

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

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

我有一个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`)
);
唯一密钥的工作原理与预期一样,它允许多个空行的id\u box\u元素和id\u路由器


我运行的是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) 表\u名称
2) 索引名称
3) 要在其上添加索引的列

ALTER TABLE  `tablename` 
ADD UNIQUE index-name
(`column1` ,`column2`,`column3`,...,`columnN`);
在您的情况下,我们可以创建唯一索引,如下所示:

ALTER TABLE `votes`ADD 
UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);
ALTER表'vows'添加
唯一的(`user`、`email`、`address`);

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

  • 可以定义涉及可空列的唯一约束。假设您定义了一个约束唯一(a,B),其中a不可为null,但B为
  • 在计算此类约束时,您可以拥有(a,null)任意次数(相同的值!)
  • 您只能有一个(A,而不是空B)对
例如: 产品名称、产品版本 “玻璃”,空 “玻璃”,空 “葡萄酒”,1

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

我这样做:

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

我对唯一的
索引\u名称的约定是
TableName\u Column1\u Column2\u Column3\u 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.id 
and a.user <=> b.user and a.email <=> b.email 
and a.address <=> b.address;
使用验证约束

SHOW CREATE TABLE votes;
请注意,如果用户、电子邮件和地址中的任何一个都有空值,则它们将被视为唯一的。

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

alter table table_name
add unique(column_name_1,column_name_2);

PostgreSQL为唯一索引指定了自己的名称。如果需要更改,我想您可以在表的选项中更改索引的名称…

本教程适合我

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

有两点需要澄清:1)这种行为不适用于
发动机BDB
,2)这是记录在案的行为,尽管鉴于其令人惊讶/不愉快的程度,没有足够公开的记录在案。有关讨论,请参阅MySQL bug 25544。感谢您提供的空提示,解决了我遇到的问题。。。我想我会使用一个哈希检查。官方文档说:注意,从MySQL 5.1开始,BDB不再受支持。为什么会出现这种疯狂的行为?这是否适用于INSERT语句的ON DUPLICATE KEY子句?也就是说,如果我试图插入与另一行的user/email/address值冲突的行,那么insert是否会执行ON DUPLICATE KEY子句指定的操作?这样,三者的组合将是唯一的?或者所有三列都是唯一的?对于那些使用MySQL workbench的人:转到Indexes选项卡并选择unique作为您的类型。给你的索引起一个名字,然后像我一样检查“索引列”部分下的相应列,如果有人从搜索引擎中找到这个。。。为了回答Clizzin的问题,如果在重复键上使用复合键,那么它肯定会使用,但是需要对语法进行一些小的调整。了解如何使其即使在使用NULL值时也能工作。如果我们插入两个相同的空值行,这是不起作用的…我想标记这个答案,因为它向您展示了如何创建一个具有唯一索引的新表,正如上面jonstjohn的答案告诉您如何更新现有表。它们的作用是相同的,但这取决于您是创建新表还是更新现有表。:)所有的反引号是怎么回事,它们有什么用途吗?它是Adminer(www.Adminer.org)的输出,它会自动插入这些反引号,所以在使用mysql关键字作为列名时不会发生冲突。Erick所说的对我来说很好:
UNIQUE KEY
thekey`(
用户
电子邮件
地址
)`。我使用的是MYSQL版本5.5.24,如果您正在使用它,您甚至可以在PHPMYADMIN中进行设置。我使用的是PMA的3.5.1版本。使用MYSQL 5.6进行了尝试。从第一次尝试开始就可以工作。谢谢Erick!它似乎在列名上没有单引号的情况下也可以工作。谢谢您的解释。我有独特的(A,B,C)我不知道为什么它允许null与相同的非null选项组合问题不适用于
PostgreSQL
数据库,提到的标签是
Mysql
ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);