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;
如果不存在具有给定 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;