我有以下查询:
INSERT INTO LICENSE_TABLE
(code, license_type, distributor)
values ("uniquecode", "standard", "walmart")
我想仅在没有已存在code="uniquecode"
的行的情况下插入行
我怎样才能做到这一点?
我发现了一些涉及INSERT IGNORE
的解决方案,关于DUAL
的一些问题,还有一些,但我不明白哪种情况适用于我的情况。
如果重要,我正在使用pymysql
。
最好的方法是使用on duplicate key update
:
首先,您需要一个唯一索引,因此数据库可以保持数据完整性。
第二:
INSERT INTO LICENSE_TABLE (code, license_type, distributor)
VALUES ('uniquecode', 'standard', 'walmart')
ON DUPLICATE KEY UPDATE code = VALUES(code);
这比使用WHERE
的EXISTS
子查询更好,因为它是线程安全的。这意味着不同线程中的多个更新不会导致问题。
这比INSERT IGNORE
更好,因为INSERT IGNORE
会忽略其他错误。 ON DUPLICATE KEY UPDATE
完全符合你的要求。
您应该首先在代码列上创建一个UNIQUE INDEX
。然后,您可以安全地插入数据而不使用警告:
INSERT INTO LICENSE_TABLE(code, license_type, distributor)
SELECT 'uniquecode', 'standard', 'walmart'
FROM (SELECT 1) AS x
WHERE NOT EXISTS (
SELECT 1
FROM LICENSE_TABLE
WHERE code = 'uniquecode'
)
只需使用INSERT IGNORE
就好
INSERT IGNORE INTO LICENSE_TABLE
(code, license_type, distributor)
values ("uniquecode", "standard", "walmart")
但是你需要在code
列上有一个唯一的索引。检查您是否已经使用show indexes from LICENSE_TABLE;
或show create table LICENSE_TABLE;
如果你没有,你可以创建一个这样的:
create unique index uidx_license_table_code on LICENSE_TABLE(code);