哪种SQL模式更快以避免插入重复的行?

Cla*_*diu 3 sql database postgresql query-optimization

我知道有两种方法可以插入而无需重复.第一个是使用一个WHERE NOT EXISTS子句:

INSERT INTO table_name (col1, col2, col3)
SELECT %s, %s, %s
WHERE NOT EXISTS (
    SELECT * FROM table_name AS T
    WHERE T.col1 = %s
      AND T.col2 = %s)
Run Code Online (Sandbox Code Playgroud)

另一个是做LEFT JOIN:

INSERT INTO table_name (col1, col2, col3)
SELECT %s, %s, %s
FROM ( SELECT %s, %s, %s ) A
LEFT JOIN table_name B
ON  B.COL1 = %s
AND B.COL2 = %s
WHERE B.id IS NULL
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

是否存在一个比另一个更快的一般规则,还是依赖于表?有不同的方式比两者都好吗?

Bil*_*win 5

我建议在您需要唯一的列上定义UNIQUE约束(在这种情况下为col1和col2),然后执行INSERT.根据需要处理异常.


关于要求回滚的异常的评论,PostgreSQL的解决方案是在尝试可能导致异常的插入之前设置事务保存点.如果出现异常,则回滚到保存点.

看到: