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

问题描述 投票:0回答:15

我有一张桌子:

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

现在我想让列 用户、电子邮件、地址唯一(一起)。

如何在 MySql 中执行此操作?

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

mysql unique-constraint composite-key database-table
15个回答
1686
投票

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

ALTER TABLE
- 更改表架构,并且

ADD UNIQUE
- 添加唯一约束。

然后您可以使用以下格式定义新的唯一密钥

'name'('column1', 'column2'...)

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

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

313
投票

我有一个 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`)
);

UNIQUE KEY 按预期工作,它允许 id_box_elements 和 id_router 的多个 NULL 行。

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


63
投票

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


27
投票

你尝试过这个吗?

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

21
投票

这适用于 mysql 版本 5.5.32

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

8
投票

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

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

示例: 产品名称、产品版本 “玻璃”,空 “玻璃”,空 ‘酒’,1

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


6
投票

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

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


6
投票

本教程适合我

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

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


5
投票

我这样做:

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

我对独特

index_name
的约定是
TableName_Column1_Column2_Column3_uindex


4
投票

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

3
投票

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

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

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

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

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

2
投票

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

UPDATE tablename SET id2 = id;

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

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

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;

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


0
投票

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

alter table table_name
add unique(column_name_1,column_name_2);

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


0
投票

在 MySQL 工作台中:

  1. 建立索引
  2. 选择列
  3. 从“类型”菜单中选择“唯一”

© www.soinside.com 2019 - 2024. All rights reserved.