35

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

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

当然,我很少有 type = 'Apple' 和 owner = 'Apple CO' 的记录。所以我的问题是,在 ALTER TABLE 之后,哪条记录将是特殊的记录,ID 最小的记录,或者可能是最新插入的最大记录?

4

2 回答 2

50

第一条记录将被保留,其余记录将被删除§§

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

我猜这里的“第一个”是指 ID 最小的那个,假设 ID 是主键。

另请注意:

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

于 2011-03-28T08:49:51.577 回答
3

看来您的问题是不推荐使用 ALTER IGNORE 的原因之一。

这是来自关于 ALTER IGNORE 弃用的MySQL 注释:

“此功能定义错误(第一行是什么?),导致复制问题,禁用在线更改以创建唯一索引,并导致外键问题(父表中删除的行)。”

于 2020-04-02T11:02:48.187 回答