Postgresql
在一組 with 之後的多個插入查詢
我正在嘗試一種可重現的方式來使用一些測試數據填充數據庫。
假設(一個過於簡化的範例)三個基本表: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 中要容易得多。只有下劃線和數字。這樣就可以避免在任何地方都使用雙引號。