Postgresql

如何編寫一個插入值的查詢,同時從另一個表中獲取值?

  • February 26, 2020

我有一個表(Tbl2),需要用另一個表(Tbl1)中的值填充。

Tbl1 有列:id (uuid), name, address, gender.

Tbl2 有列:id (uuid), org, name, address, gender, createdAt, updatedAt.

我想從id, name, address, gender復製tbl1tbl2. 如何編寫將這些值插入 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');

請注意,我不必指定idororg欄位,因為有 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_atupdated_at欄位也已包含在內 - 預設為NOW(). 為了updated_at自動修改該欄位,您需要使用TRIGGER- 如果您進行搜尋,那麼在所有唱歌,所有跳舞的網路上都有數百萬。如果這不能回答您的問題,請告訴我,我會看看我能做些什麼。ps 歡迎來到論壇!

創建一個tbl1.id到新值的表映射,然後只需將連接這些表的 SELECT 插入到 tbl2 中。這是一個例子:

https://www.db-fiddle.com/f/eSRqTAdH9b2cwfuJfwrJ1B/0

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