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
【讨论】:
+1If 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 - 使现有字段唯一的主要内容,如果未能解决你的问题,请参考以下文章