Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL插入忽略不工作_Mysql_Insert_Duplicates - Fatal编程技术网

MySQL插入忽略不工作

MySQL插入忽略不工作,mysql,insert,duplicates,Mysql,Insert,Duplicates,这是我的表格和一些样本数据 a_id | b_id ------------ 1 225 2 494 3 589 当我运行此查询时 INSERT IGNORE INTO table_name (a_id, b_id) VALUES ('4', '230') ('2', '494') 当它应该忽略第二个值对(2494)时,它会插入这两行 没有定义索引,这些列都不是主列 我不知道什么?如果没有主键,就不能忽略重复键。您应该始终设置一个主键,所以请这样做-如果您希望有

这是我的表格和一些样本数据

a_id | b_id
------------
  1    225
  2    494
  3    589
当我运行此查询时

INSERT IGNORE INTO table_name (a_id, b_id) VALUES ('4', '230') ('2', '494')
当它应该忽略第二个值对(2494)时,它会插入这两行

没有定义索引,这些列都不是主列


我不知道什么?

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

如果您没有设置一个
唯一的
标准或设置
主键,MySql将不会知道您的新条目是重复的。

来自:

如果使用IGNORE关键字,则执行INSERT语句时发生的错误将改为警告。例如,在不忽略的情况下,复制表中现有唯一索引或主键值的行将导致重复键错误,语句将中止。使用IGNORE时,仍不会插入行,但不会发出错误

(我的斜体)

您的行没有复制“现有唯一索引或主键值”,因为您既没有主键也没有任何唯一约束


如您在一条注释中所述,如果您不希望两个字段都是唯一的,但确实希望组合是唯一的,则需要在两列之间使用复合主键(首先消除任何重复项):


如果我理解正确,那么在运行insert命令后,您的表如下所示

1   225
2   494
3   589
4   230
2   494
如果是这样,那么答案是因为您的表设计允许重复


如果要防止插入第二条记录,则需要将a_id列定义为主键或唯一索引。如果这样做,则insert ignore语句将按预期工作,即插入记录,忽略错误,例如尝试添加重复记录。

Hmm。。。那么,如何在不需要主键的情况下忽略重复的行呢?我不想将特定列设置为唯一列。我希望两列的组合是唯一的。例如,可以有一行(3589)和一行(3330),但不能有两行(3589),因此需要使用多列唯一约束。示例已由paxdiablo提供。这将满足您的要求。如果你想让MySQL处理你的忽略请求,你必须有一个唯一的约束。我有主键autoincrement,但仍然不适用于我
1   225
2   494
3   589
4   230
2   494