在插入之前总是检查选择?

Jam*_*mes 6 mysql insert unique-constraint

如果我INSERT只在主键尚不存在时才想要一行,INSERT直接执行并在重复的情况下忽略错误是否更有效/更简单,还是应该始终先运行SELECT以检查它是否已经存在?

McN*_*ets 5

您可以使用 WHERE NOT EXISTS 在插入新记录之前检查新值。

INSERT INTO <table>
(
    field1, field2, field3
)
SELECT value1, value2, value3
FROM dual
WHERE NOT EXISTS (SELECT 1
                  FROM <table>
                  WHERE <pk fields> = <new values>);
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE foo(id int, v1 int, v2 int);
INSERT INTO foo VALUES (1, 100,100);
INSERT INTO foo VALUES (2, 200, 200);
Run Code Online (Sandbox Code Playgroud)

此记录存在且不应插入:

INSERT INTO foo (id, v1, v2)
SELECT 1, 101, 101
FROM   dual
WHERE NOT EXISTS (SELECT 1 FROM foo WHERE id=1);
Run Code Online (Sandbox Code Playgroud)

这是一个新记录:

INSERT INTO foo (id, v1, v2)
SELECT 3, 300, 300
FROM   dual
WHERE NOT EXISTS (SELECT 1 FROM foo WHERE id=3);
Run Code Online (Sandbox Code Playgroud)

最终结果:

SELECT * FROM foo;
Run Code Online (Sandbox Code Playgroud)
身份证 | v1 | v2
-: | --: | ——:
 1 | 100 | 100
 2 | 200 | 200
 3 | 300 | 300

dbfiddle在这里