MySQL: ALTER IGNORE TABLE ADD UNIQUE,将会被截断的是什么?

38

我有一个有4个列的表:ID,类型,所有者,描述。 ID是AUTO_INCREMENT PRIMARY KEY,现在我想要:

ALTER IGNORE TABLE `my_table`
    ADD UNIQUE (`type`, `owner`);

当然,我有一些类型为'Apple'且所有者为'Apple CO'的记录。所以我的问题是,在进行ALTER TABLE操作后,哪条记录将成为特殊的记录,是具有最小ID的记录还是最近插入的具有最大ID的记录?


2
MYSQL中的ALTER IGNORE已被弃用。 - Derek Gogol
2个回答

51

只保留第一条记录,其余删除。具体可参见§§

IGNORE是MySQL扩展的标准SQL,用于控制ALTER TABLE在新表中存在重复唯一键或启用严格模式时出现警告时的操作方式。如果未指定IGNORE,则如果出现重复键错误,拷贝操作将中止并回滚。如果指定了IGNORE,则仅使用具有唯一键上副本的第一行。其他冲突行将被删除。不正确的值将截断为最接近的匹配可接受值。

这里的“first”意味着具有最小ID的那个,假设ID是主键。

此外,请注意:

自MySQL 5.7.4起,ALTER TABLEIGNORE子句已被删除,使用它会产生一个错误


我经常听到这样的说法,即(SQL)数据库没有固有的顺序,因此在选择记录时如果没有ORDER BY子句,我们得到的顺序对于我们的目的来说是随机的,这取决于MySQL从磁盘/内存中检索数据的方式。因此,我猜想'first'指的是'MySQL遇到的第一个',意味着更或多或少是随机的。 - user151841
这在BLOB/TEXT列上无法工作。它会出现错误“在没有键长度的情况下在关键规范中使用了BLOB/TEXT列'name'”。 - Dashrath
1
@Dashrath - 这个错误与本问题的主题无关。请阅读有关BLOB列创建和索引的手册。http://dev.mysql.com/doc/refman/5.7/en/blob.html - Galz

4
看起来你的问题正是 ALTER IGNORE 被弃用的主要原因之一。
这是来自 MySQL notes 关于 ALTER IGNORE 弃用的说明:
“该功能定义不明确(什么是第一行?),会对复制造成问题,禁用唯一索引创建的在线修改,并且会在外键方面造成问题(从父表中删除的行)。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接