MySQL INSERT IGNORE无效

12

这是我的带有一些示例数据的表格

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)

没有定义索引,这两列都不是主键。

我缺少什么信息?

4个回答

19

根据文档

如果使用 IGNORE 关键字,在执行 INSERT 语句时发生错误将被视为警告。例如,如果没有使用 IGNORE,插入表中已存在的唯一索引或主键值的行会导致重复键错误并中止语句的执行。使用 IGNORE,行不会被插入,但是不会发出错误。

(我的斜体字)

由于您没有主键或任何唯一约束,因此您的行没有复制“现有的唯一索引或主键值”。


如果像您在其中一个评论中提到的那样,您既不想让字段成为唯一的,但是您希望组合是唯一的,那么您需要跨两个列创建一个复合主键(首先消除任何重复项):

alter table MYTABLE add primary key (a_id,b_id)

3
如果您不设置UNIQUE条件或设置PRIMARY KEY,MySql将不知道您的新条目是否重复。

我有主键自增,但仍然无法正常工作。 - Erors

1

如果没有主键,就不可能有重复的键可以忽略。您应该始终设置一个主键,请这样做 - 如果您想要具有不应重复的其他列,请将它们设置为“唯一”。


哦,那么我如何在不需要主键的情况下忽略重复行呢?我也不想将特定列设置为唯一的。我希望两个列的组合是唯一的。例如,可能会有一行(3,589)和一行(3,330),但不能有两个(3,589)的行。 - HyderA
你需要使用多列唯一约束。paxdiablo已经提供了示例,这将满足你的要求。如果你想让MySQL处理你的IGNORE请求,你必须有一个唯一约束。 - Fenton

0

如果我理解正确,您在运行插入命令后,您的表看起来像这样

1   225
2   494
3   589
4   230
2   494

如果是这样,那么答案是因为您的表设计允许重复。

如果您希望防止第二条记录被插入,则需要将a_id列定义为主键或唯一索引。如果这样做,然后insert ignore语句将按照您的期望工作,即插入记录,忽略诸如试图添加重复记录等错误。


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