这是我的带有一些示例数据的表格
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)
没有定义索引,这两列都不是主键。
我缺少什么信息?
这是我的带有一些示例数据的表格
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)
没有定义索引,这两列都不是主键。
我缺少什么信息?
根据文档:
如果使用 IGNORE 关键字,在执行 INSERT 语句时发生错误将被视为警告。例如,如果没有使用 IGNORE,插入表中已存在的唯一索引或主键值的行会导致重复键错误并中止语句的执行。使用 IGNORE,行不会被插入,但是不会发出错误。
(我的斜体字)
由于您没有主键或任何唯一约束,因此您的行没有复制“现有的唯一索引或主键值”。
如果像您在其中一个评论中提到的那样,您既不想让字段成为唯一的,但是您希望组合是唯一的,那么您需要跨两个列创建一个复合主键(首先消除任何重复项):
alter table MYTABLE add primary key (a_id,b_id)
UNIQUE
条件或设置PRIMARY KEY
,MySql将不知道您的新条目是否重复。如果没有主键,就不可能有重复的键可以忽略。您应该始终设置一个主键,请这样做 - 如果您想要具有不应重复的其他列,请将它们设置为“唯一”。
如果我理解正确,您在运行插入命令后,您的表看起来像这样
1 225
2 494
3 589
4 230
2 494
如果是这样,那么答案是因为您的表设计允许重复。
如果您希望防止第二条记录被插入,则需要将a_id列定义为主键或唯一索引。如果这样做,然后insert ignore语句将按照您的期望工作,即插入记录,忽略诸如试图添加重复记录等错误。