我有以下查询:
INSERT INTO LICENSE_TABLE
(code, license_type, distributor)
values ("uniquecode", "standard", "walmart")
仅当不存在已经有code="uniquecode"
我该怎么做?
我找到了一些涉及INSERT IGNORE
的解决方案,有关DUAL
的一些解决方案,还有其他一些解决方案,但是我不知道哪种解决方案适用于我的情况。
如果有关系,我正在使用pymysql
。
答案 0 :(得分:2)
执行此操作的最佳方法是使用on duplicate key update
:
首先,您需要一个唯一索引,因此数据库可以保持数据完整性。
第二:
INSERT INTO LICENSE_TABLE (code, license_type, distributor)
VALUES ('uniquecode', 'standard', 'walmart')
ON DUPLICATE KEY UPDATE code = VALUES(code);
这比使用WHERE
的{{1}}子查询要好,因为它是线程安全的。这意味着不同线程中的多次更新将永远不会造成问题。
这比EXISTS
更好,因为INSERT IGNORE
将忽略其他错误。 INSERT IGNORE
正是您想要的。
答案 1 :(得分:1)
您应该首先在代码列上创建一个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'
)
答案 2 :(得分:0)
只需像使用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);