Postgresql

在一組 with 之後的多個插入查詢

  • March 11, 2018

我正在嘗試一種可重現的方式來使用一些測試數據填充數據庫。

假設(一個過於簡化的範例)三個基本表:name、city、job 和兩個關係表:name-city 和 name-job。我需要在三個基表中的每一個中創建一個條目,並使用上述條目在兩個關係表中創建條目。

我已經擁有的是一種使用一系列with查詢在 3 個基表中創建條目並將值插入到 ONE 關係表中的方法。

with x as 
(INSERT INTO "public"."name" VALUES(DEFAULT) RETURNING "id"),
y as 
(INSERT INTO "public"."job" VALUES(DEFAULT) RETURNING "id"),
z as 
(INSERT INTO "public"."city" VALUES(DEFAULT) RETURNING "id")

INSERT INTO "public"."name-job"("name", "job")  
select x.id, y.id from x,y;

我真的很想添加第二個插入語句

INSERT INTO "public"."name-city"("name", "city")  
select x.id, z.id from x,z;

在第一次插入後,但不知道如何。我嘗試用​​逗號分隔兩個插入語句,並將它們括在括號中,然後用逗號分隔它們,以及其他一些方法,但沒有任何效果。

在第二個插入中使用全新的語句並不完全是一種選擇,因為我需要使用相同的 x、y、z 值。鑑於我缺乏專業知識/經驗,我完全有可能遺漏了一些明顯的東西……所以任何關於我如何做到這一點的想法,理想情況下,沒有高度複雜的工具,將是最受歡迎的。

FWIW,我正在使用 Postgres (10.x)

您需要將其INSERT INTO "name-job"放入另一個 CTE。您也可以將最後一個插入插入"name-city"到 CTE 中,並添加 aSELECT以獲取所有插入的 id(以及插入行中您需要的任何其他內容)。

WITH 
 x AS 
 (INSERT INTO public.name VALUES (DEFAULT) RETURNING id),
 y AS 
 (INSERT INTO public.job VALUES (DEFAULT) RETURNING id),
 z AS
 (INSERT INTO public.city VALUES (DEFAULT) RETURNING id),
 xy AS
 (INSERT INTO public."name-job" (name, job)  
  SELECT x.id, y.id FROM x,y
  RETURNING name, job),
 xz AS
 (INSERT INTO public."name-city" (name, city)  
  SELECT x.id, z.id FROM x,z
  RETURNING name, city)
SELECT x.id, y.id, z.id, xy.*, xz.*
FROM x, y, z, xy, xz ;
  • 如果要在表中插入多行,則查詢需要更複雜(使用聯接而不是隱式交叉聯接)。
  • 表和列的命名將是一個持續的麻煩和痛苦。如果所有表名和列名都是小寫並且不使用特殊字元(例如您使用的破折號),我發現在 Postgres 中要容易得多。只有下劃線和數字。這樣就可以避免在任何地方都使用雙引號。

引用自:https://dba.stackexchange.com/questions/199916