如何編寫一個插入值的查詢,同時從另一個表中獲取值?
我有一個表(Tbl2),需要用另一個表(Tbl1)中的值填充。
Tbl1 有列:
id (uuid), name, address, gender
.Tbl2 有列:
id (uuid), org, name, address, gender, createdAt, updatedAt
.我想從
id, name, address, gender
復製tbl1
到tbl2
. 如何編寫將這些值插入 Tbl2 的查詢,同時提供新的 ids、org、createdAt 和 updatedAt 值?
您需要查看
DEFAULT
條款。我認為您想要以下內容作為範例:CREATE TABLE tbl2 ( id TEXT NOT NULL DEFAULT(MD5(RANDOM()::TEXT)), org TEXT NOT NULL DEFAULT SUBSTRING(MD5(RANDOM()::TEXT) FROM 1 FOR 4), name TEXT NOT NULL, address TEXT NOT NULL, gender CHAR(1) NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), update_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CONSTRAINT tbl2_pk PRIMARY KEY (id) );
請注意,我正在使用
id TEXT NOT NULL DEFAULT(MD5(RANDOM()::TEXT))
作為
PRIMARY KEY
. 就本答案而言,這與 UUID 足夠接近 - 我正在使用 dbfiddle(請參閱此連結)並且無法安裝UUID
擴展。我也使用SUBSTRING
相同的函式來生成org
欄位值,因為我不知道那是什麼——我原以為這是一個參考表,可以參考聯合國、歐盟、北約、東盟……&c . 會更適合這個,但是,只有你知道 - 見@Philᵀᴹ’s com然後用一些值填充它:
INSERT INTO tbl2 (name, address, gender) VALUES ('Name_23', 'Address_23', 'M'), ('Name_24', 'Address_24', 'F'), ('Name_25', 'Address_25', 'M');
請注意,我不必指定
id
ororg
欄位,因為有 aDEFAULT
就位。現在,我們對tbl1
.CREATE TABLE tbl1 ( id TEXT NOT NULL DEFAULT(MD5(RANDOM()::TEXT)), name TEXT NOT NULL, address TEXT NOT NULL, gender CHAR(1) NOT NULL, CONSTRAINT tbl1_pk PRIMARY KEY (id) );
和:
INSERT INTO tbl1 (name, address, gender) VALUES ('Name1', 'Address_1', 'M'), ('Name2', 'Address_2', 'F'), ('Name3', 'Address_3', 'M');
然後
INSERT
執行:INSERT INTO tbl2 (name, address, gender) SELECT name, address, gender FROM tbl1 -- WHERE tbl.id NOT IN (SELECT id FROM tbl1) -- MD5 should ensure uniqueness RETURNING name, address, gender; -- this is optional - check it out.
然後我們檢查我們的
tbl2
:SELECT * FROM tbl2;
結果:
id org name address gender created_at update_at 1feaceed5c2d8e37f5565d222b5bd31c 28a1 Name_23 Address_23 M 2020-02-26 05:43:28.366588+00 2020-02-26 05:43:28.366588+00 508c0eecc16e305687b355c684cd5d56 d057 Name_24 Address_24 F 2020-02-26 05:43:28.366588+00 2020-02-26 05:43:28.366588+00 247d6d7bdcef078c4b4f7bef33e91d01 78a5 Name_25 Address_25 M 2020-02-26 05:43:28.366588+00 2020-02-26 05:43:28.366588+00 07bcc6cf6a3a3b79fcc05bafe9ebc8c2 05f8 Name1 Address_1 M 2020-02-26 05:43:28.395899+00 2020-02-26 05:43:28.395899+00 029ef1b1c21df2a0fe25da352114aa1f 48c2 Name2 Address_2 F 2020-02-26 05:43:28.395899+00 2020-02-26 05:43:28.395899+00 f4f51eccf9d4bfa7e011bdc4b2c135b8 8723 Name3 Address_3 M 2020-02-26 05:43:28.395899+00 2020-02-26 05:43:28.395899+00
一個簡單的檢查表明我們
INSERT
已經工作了。最後,請注意我們的created_at
和updated_at
欄位也已包含在內 - 預設為NOW()
. 為了updated_at
自動修改該欄位,您需要使用TRIGGER
- 如果您進行搜尋,那麼在所有唱歌,所有跳舞的網路上都有數百萬。如果這不能回答您的問題,請告訴我,我會看看我能做些什麼。ps 歡迎來到論壇!
創建一個
tbl1.id
到新值的表映射,然後只需將連接這些表的 SELECT 插入到 tbl2 中。這是一個例子: