我有三列: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.
答案 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_a
,column_b
和column_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
);
如果您尝试插入重复项,查询将不执行任何操作(并且不会生成错误或警告)。