如果表中的列值尚不存在,则将行插入表中

问题描述 投票:0回答:3

我有以下查询:

INSERT INTO LICENSE_TABLE
(code, license_type, distributor)
values ("uniquecode", "standard", "walmart")

我想仅在没有已存在code="uniquecode"的行的情况下插入行

我怎样才能做到这一点?

我发现了一些涉及INSERT IGNORE的解决方案,关于DUAL的一些问题,还有一些,但我不明白哪种情况适用于我的情况。

如果重要,我正在使用pymysql

mysql sql
3个回答
2
投票

最好的方法是使用on duplicate key update

首先,您需要一个唯一索引,因此数据库可以保持数据完整性。

第二:

INSERT INTO LICENSE_TABLE (code, license_type, distributor)
    VALUES ('uniquecode', 'standard', 'walmart')
    ON DUPLICATE KEY UPDATE code = VALUES(code);

这比使用WHEREEXISTS子查询更好,因为它是线程安全的。这意味着不同线程中的多个更新不会导致问题。

这比INSERT IGNORE更好,因为INSERT IGNORE会忽略其他错误。 ON DUPLICATE KEY UPDATE完全符合你的要求。


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'
)

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);
© www.soinside.com 2019 - 2024. All rights reserved.