SQL Postgres - 插入到不存在的地方

SQL Postgres - INSERT INTO WHERE NOT EXISTS

如果不存在具有给定 id_client 的行(在 PostgreSQL 中),我想将新行插入到表 A 中:

INSERT INTO tableA(id_client, opr_wpr, data_wpr)
    VALUES((SELECT id_client FROM tableB WHERE id = 272), 212121, now());

我该怎么做?

INSERT INTO tableA(id_client, opr_wpr, data_wpr)
    VALUES((SELECT id_client FROM tableB WHERE id != null), 212121, now());

像这样:

INSERT INTO tableA(id_client, opr_wpr, data_wpr)
SELECT b.id_client, 212121, now() 
FROM 
  tableB b 
  LEFT JOIN tableA a 
  ON b.id_client = a.id_client
WHERE b.id = 272 AND a.id_client is null;

select 查询只有 return 一行,当有:

  • tableB 中的一条记录,id 为 272
  • 表 A 中没有与该 b.id_client
  • 相关的记录

当没有行时,左连接将 return 在 tableA.id_client 中为空值。一旦为该 id_client 向表 A 插入一行,左连接将停止 return 空值,而是 return 相关行。 a.id_client 为空是 WHERE 的一个条件,但它不再是。这会导致 SELECT 语句改为 return 0 行,这意味着没有插入任何内容

使用 SELECT 作为 INSERT 的来源:

with data as (
  SELECT id_client, 212121 as opr_wpr, now() as data_wpr
  FROM tableB 
  WHERE id = 272
)
INSERT INTO tablea(id_client, opr_wpr, data_wpr)
SELECT *
FROM data
WHERE not exists (select * 
                  from tablea
                  where id_client in (select id_client
                                      from data));

使用普通的table表达式,源条件只需要提供一次。


或者,如果您对 tablea.id_client 有唯一约束,那么您可以简单地执行:

INSERT INTO tablea(id_client, opr_wpr, data_wpr)
SELECT id_client, 212121, now()
FROM tableB 
WHERE id = 272
on conflict (id_client) do nothing;