MySQL-使现有字段唯一


155

我有一个已经存在的表,该表的字段应该唯一,但不是。我只知道这一点,因为在表中创建了一个条目,该条目具有与另一个已经存在的条目相同的值,这导致了问题。

如何使该字段仅接受唯一值?

Answers:


293
ALTER IGNORE TABLE mytbl ADD UNIQUE (columnName);

对于MySQL 5.7.4或更高版本:

ALTER TABLE mytbl ADD UNIQUE (columnName);

从MySQL 5.7.4开始,ALTER TABLE的IGNORE子句被删除,使用它会产生错误。

因此,请确保先删除重复的条目,因为不再支持IGNORE关键字。

参考


62
+1 If IGNORE is specified, only the first row is used of rows with duplicates on a unique key, The other conflicting rows are deleted. 文件
Scrum Meister

1
有没有一种方法可以告诉它基于特定条件删除行?还是您需要先进行一些预处理才能ALTER完成此任务。
corsiKa 2011年

7
ALTER IGNORE为了您的数据安全起见,在MySQL版本> 5.5和InnoDB上,仍可能会出现Duplicate错误。如果您确定保留重复行中的第一行是正确的事情,请尝试set session old_alter_table=1。不要忘记重新设置它。mysqlolyk.wordpress.com/2012/02/18/...
michaelliu

2
对于使用5.6.7或更高版本绊脚石的任何人,将不再支持IGNORE。moredocs我想现在要做的是确保您首先没有重复,不是吗?
William T. Mallard

1
在运行此查询之前,请确保对表进行备份。如果列名具有相同的值或为空,它将删除除第一行以外的所有行。
稳定爸爸

34

只需在您的数据库phpmyadmin中编写此查询即可。

ALTER TABLE TableName ADD UNIQUE (FieldName)

例如: ALTER TABLE user ADD UNIQUE (email)


16

如果您还想命名约束,请使用以下命令:

ALTER TABLE myTable
  ADD CONSTRAINT constraintName 
    UNIQUE (columnName);

7

CREATE UNIQUE INDEX foo ON table_name (field_name)

您必须在执行该sql之前删除该列上的重复值。该列上的任何现有重复值都将导致您出现mysql错误1062


4

最简单,最快的方法是使用phpmyadmin结构表。

使用PHPMYADMIN管理面板!

那里是俄语,但是英语版本应该相同。只需单击唯一按钮。您也可以从那里将列设置为PRIMARY或DELETE。


2
ALTER IGNORE TABLE mytbl ADD UNIQUE (columnName);

是正确的答案

插入部分

INSERT IGNORE INTO mytable ....

1

这段代码是为了解决我们为现有表设置唯一键的问题

alter ignore table ioni_groups add unique (group_name);

但删除所有重复项,包括列外的重复项
Biasi Wiga
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.