这是我的表格,其中包含一些示例数据
a_id | b_id
------------
1 225
2 494
3 589
当我运行此查询时
INSERT IGNORE INTO table_name (a_id, b_id) VALUES ('4', '230') ('2', '494')
当它应该忽略第二个值对时,它会插入这些行(2,494)
没有定义索引,这些列都不是主要的。
我不知道什么?
答案 0 :(得分:13)
来自docs:
如果使用IGNORE关键字,则执行INSERT语句时发生的错误将被视为警告。例如,如果没有IGNORE,复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句将中止。使用IGNORE时,仍未插入行,但未发出错误。
(我的斜体)。
您的行没有复制“现有的UNIQUE索引或PRIMARY KEY值”,因为您没有主键也没有任何唯一约束。
如果正如您在其中一条评论中提到的那样,您希望这两个字段都不是唯一的,但您做希望组合是唯一的,那么您需要跨两列的复合主键(摆脱它)任何重复的第一个):
alter table MYTABLE add primary key (a_id,b_id)
答案 1 :(得分:3)
如果您没有设置UNIQUE
条件或设置PRIMARY KEY
,MySql将不会知道您的新条目是重复的。
答案 2 :(得分:1)
如果没有主键,则无法忽略重复键。你应该总是设置一个主键,所以请这样做 - 如果你想要有不应该重复的其他列,请将它们设置为“唯一”。
答案 3 :(得分:0)
如果我理解正确,在运行insert命令后,您的表就像这样
1 225
2 494
3 589
4 230
2 494
如果是这样,那么答案是因为你的表设计允许重复。
如果您希望它阻止插入第二条记录,则需要将a_id列定义为主键或唯一索引。如果这样做,那么insert ignore语句将按预期工作,即插入记录,忽略错误,例如尝试添加重复记录。