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

时间:2018-09-12 08:35:07

标签: mysql sql

我有以下查询:

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

仅当不存在已经有code="uniquecode"

的行时,我才想插入行

我该怎么做?

我找到了一些涉及INSERT IGNORE的解决方案,有关DUAL的一些解决方案,还有其他一些解决方案,但是我不知道哪种解决方案适用于我的情况。

如果有关系,我正在使用pymysql

3 个答案:

答案 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);