如果所有值都不连续出现,则插入记录

时间:2019-02-12 22:15:05

标签: python mysql sql

我有三列:a,b,c。

如果a,b,c还不存在,我想插入新行。

使用Python执行此操作。

INSERT INTO mytable(column_a, column_b, column_c) 
VALUES(value_a, value_b, value_c) 
WHERE value_a, value_b, value_c are all unique in existing rows. 

2 个答案:

答案 0 :(得分:3)

一种解决方法是在三列上创建唯一索引。如果您尝试插入重复的行,数据库将拒绝该插入。无需特殊查询。这应该适用于任何关系数据库,而不仅仅是MySQL。

使用以下方法创建唯一索引:

CREATE UNIQUE INDEX a_b_c ON mytable (column_a, column_b, column_c)

像这样插入:

INSERT INTO mytable(column_a, column_b, column_c) VALUES (value_a, value_b, value_c)

如果已经存在column_acolumn_bcolumn_c列具有相同值的行,则数据库将拒绝插入,并且您会在Python中看到异常。

答案 1 :(得分:3)

如果您可以实施一种通用机制来避免在column_a / b / c列上重复,则可以简单地在两个列上添加复合唯一约束,例如

ALTER TABLE mytable 
ADD CONSTRAINT constr_ID UNIQUE (column_a, column_b, column_c);

如果在表上发生任何会产生重复的操作,MySQL将引发约束冲突错误。您可以使用ON DUPLICATE KEY UPDATE选项忽略该错误:

INSERT INTO mytable(column_a, column_b, column_c)
VALUES(value_a, value_b, value_c)
ON DUPLICATE KEY UPDATE column_a = column_a;

在此 demo on DB Fiddle 中,我们将插入3条记录,其中包含2个重复项,最后按预期在表中包含2条记录。


另一方面,如果您想将对重复项的检查限制为仅一个查询,并且/或者如果要避免在重复键上浪费自动递增序列,则可以使用INSERT ... SELECT语句,带有WHERE NOT EXISTS条件,并执行重复检查:

INSERT INTO mytable(column_a, column_b, column_c)
SELECT src.*
FROM (SELECT value_a column_a, value_b column_b, value_c column_c) src
WHERE NOT EXISTS (
    SELECT 1 
    FROM mytable
    WHERE 
        column_a = src.column_a 
        AND column_b = src.column_b 
        AND column_c = src.column_c
);

如果您尝试插入重复项,查询将不执行任何操作(并且不会生成错误或警告)。

Demo on DB Fiddle