为了避免重复插入,我知道我可以使用“insert IGNORE”或“INSERT…”在mysql中更新重复密钥“。
但我使用的是laravel,我知道firstOrCreate不会这样做。它首先进行SELECT以查看条目是否存在,然后仅当SELECT没有返回任何记录时才插入。我猜这是因为DUPLICATE KEY UPDATE是特定于MySQL的。
从性能的角度来看,我先选择再插入,这真的很糟糕。与“INSERT IGNORE”或“INSERT…”相比,这会对性能产生多大影响在重复密钥更新时“?
不使用firstOrCreate并编写自己的php代码来“插入忽略”或“插入…”是否值得呢?在重复密钥更新时“?
发布于 2019-09-02 14:06:59
假设您只需要INSERT INTO ... IGNORE功能,我建议您只在有问题的表上创建一个惟一的索引。
ALTER TABLE yourTable ADD CONSTRAINT cnstr UNIQUE KEY (col1, col2, ...);执行此操作后,任何插入重复记录的尝试都会在PHP端导致应用程序错误,您可以轻松地捕获和处理该错误。
在尝试插入之前先执行插入以检查是否存在重复项的问题是,只有在确保从选择的时间到插入完成的时间内表中没有发生其他DML活动时,这样的逻辑才会起作用。否则,可能会出现如下情况:
process1: SELECT to check if record exists (assume it does not)
process2: INSERT record (which process1 wants to insert)
process1: INSERT same record (now a duplicate exists)换句话说,您的PHP应用程序将“认为”不存在重复项,并插入记录。但是,在select和insert之间的时间内,另一个进程恰好插入了相同的记录。
为了避免这种情况,我相信你需要一个类似于可序列化事务的东西。但是,使用唯一约束要清晰得多,并将这一责任主要留给数据库来处理。
发布于 2019-09-02 16:29:55
也许可以在mysql中尝试REPLACE:
REPLACE ...https://stackoverflow.com/questions/57751702
复制相似问题