MySQL - 使现有字段唯一

Posted

技术标签:

【中文标题】MySQL - 使现有字段唯一【英文标题】:MySQL - Make an existing Field Unique 【发布时间】:2011-06-29 14:40:12 【问题描述】:

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

如何让这个字段只接受唯一值?

【问题讨论】:

【参考方案1】:

CREATE UNIQUE INDEX foo ON table_name (field_name)

在执行该 sql 之前,您必须删除该列上的重复值。 该列上任何现有的重复值都会将您引导至mysql error 1062

【讨论】:

【参考方案2】:

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

ALTER TABLE TableName ADD UNIQUE (FieldName)

例如:ALTER TABLE user ADD UNIQUE (email)

【讨论】:

【参考方案3】:

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

ALTER TABLE myTable
  ADD CONSTRAINT constraintName 
    UNIQUE (columnName);

【讨论】:

【参考方案4】:
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 关键字。

Reference

【讨论】:

+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. Docs 有没有办法告诉它根据特定条件删除行?或者您是否需要在ALTER 之前进行一些预处理才能完成这项工作。 ALTER IGNORE 可能仍然会在 MySQL 版本 > 5.5 和 InnoDB 上出现重复错误,以确保您的数据安全。如果您确定保留重复行中的第一行是正确的,请尝试set session old_alter_table=1。别忘了把它放回去。 mysqlolyk.wordpress.com/2012/02/18/… 对于使用 5.6.7 或更高版本偶然发现此问题的任何人,不再支持 IGNORE。 moredocs我想现在的方法是先确保你没有重复,不是吗? 确保在运行此查询之前制作表的备份副本。如果列名具有相同的值或为空,它将删除除第一行之外的所有行。【参考方案5】:

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

alter ignore table ioni_groups add unique (group_name);

【讨论】:

但删除所有重复项,包括列外的重复项【参考方案6】:

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

那里是俄文,但英文版应该是一样的。只需单击唯一按钮。您也可以从那里将列设为 PRIMARY 或 DELETE。

【讨论】:

【参考方案7】:
ALTER IGNORE TABLE mytbl ADD UNIQUE (columnName);

是正确的答案

插入部分

INSERT IGNORE INTO mytable ....

【讨论】:

以上是关于MySQL - 使现有字段唯一的主要内容,如果未能解决你的问题,请参考以下文章

Django/MySQL:即使字段值是唯一的,使非唯一字段唯一也会失败

Solr Composite 来自模式中现有字段的唯一键

向现有 django 模型添加新的唯一字段时的最佳实践

MySql 创建索引原则

mysql三范式

mysql文件导入现有数据库表中