我的问题是关于特定情况的最佳做法。
每天,大约有5k条记录被插入到表格中。它们在4列上是独一无二的。发生的事情是,在此过程中大约100次,系统再次处理信息并尝试插入它们,MySQL正确返回完整性约束错误。
这是我的问题: 什么是更有效率和最佳实践:继续让返回错误或者在插入它们之前对所有5000条记录运行选择以查看它们是否已经存在,如果是,则返回现有记录的PK?
谢谢你的时间!
更新:
这些是5k SINGLE插页。
我目前没有以任何方式处理错误,我知道这很糟糕。如果你能指出我正确的方向,我将不胜感激。示例如下。插入只是炸弹,系统继续处理下一条记录。
警告:PDOStatement :: execute()[pdostatement.execute]:SQLSTATE [23000]:完整性约束违规:1062重复条目'1-Bananas 4 oz-Produce'用于键'store_id_2'在 /path/to/file/database.class.php 的第 53
行答案 0 :(得分:0)
您还有其他选择。
你可以这样做:
insert ignore into . . .
这将忽略任何错误,因此不会报告。我并不是真的建议这个,因为它会忽略任何类型的错误,你只想忽略一种类型。
你也可以这样做:
insert into . . .
on duplicate key update blah = blah;
这是blah
是任意列的地方。这基本上是on duplicate key ignore
,所以它只在违反约束时才进行更新 - 这实质上忽略了这种违规。进行更新时,实际上什么都没做,只有轻微的开销。在insert
的上下文中,这是非常小的。
你也可以这样做:
insert into . . .
select . . .
from dual
where not exists (select 1 from t where keys = keyvalus being inserted);
这是一个显式测试,仅在值不存在时插入。
最后两个选项的开销最小。在任何插入表中,MySQL需要在唯一索引中查找密钥以保证唯一性。因此,明确地这样做不会给查询增加太多成本。