如果您可以实现一种通用机制来避免列 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.