PostgreSQL 中的更新和連線語句
Joy Idialu
2023年1月30日
2022年5月14日
本教程將引導你使用 UPDATE
和 JOIN
語句更新表。
在 PostgreSQL 中生成發貨示例
考慮一家銷售食品的商店。每當貨物到達時,產品的價格就會更新以反映當前的市場價格。
在此示例中,有兩個表:Produce 和 Shipment。
生產表:
|id | price|
-----|-------
| 1 | 0|
| 2 | 0|
| 3 | 0|
| 4 | 0|
| 5 | 0|
| 6 | 0|
| 7 | 0|
| 8 | 0|
| 9 | 0|
| 10 | 0|
CREATE TABLE produce
(
id integer NOT NULL
GENERATED ALWAYS AS IDENTITY,
price integer NOT NULL,
CONSTRAINT pk_produce PRIMARY KEY (id)
)
這是用預設成本 0 填充 Produce 表的 INSERT
語句:
INSERT INTO produce(price)
SELECT 0
FROM generate_series(1,10) i
出貨表:
|id | produce_id | produce_price|
-----|------------|---------------
| 1 | 1 | 193|
| 2 | 2 | 41|
| 3 | 3 | 184|
| 4 | 4 | 192|
| 5 | 5 | 174|
| 6 | 6 | 122|
| 7 | 7 | 70|
| 8 | 8 | 130|
| 9 | 9 | 105|
| 10 | 10 | 176|
CREATE TABLE shipment
(
id integer NOT NULL
GENERATED ALWAYS AS IDENTITY,
produce_id integer NOT NULL,
produce_price integer NOT NULL,
CONSTRAINT pk_shipment PRIMARY KEY (id),
CONSTRAINT fk_shipment_produce FOREIGN KEY (produce_id) REFERENCES produce (id)
)
這是用測試資料填充 Shipment 表的 INSERT
語句:
INSERT INTO shipment (produce_id, produce_price)
SELECT i, floor(random()*(200-20+1))+20
FROM generate_series(1,10) i
使用 UPDATE
和 JOIN
語句更新 PostgreSQL 中的表
Produce 表中的 price 欄位從貨件的 produce_price
欄位更新,如下所示:
UPDATE produce
SET price = s.produce_price
FROM shipment AS s
LEFT JOIN produce AS p ON s.produce_id = p.id
WHERE produce.id = p.id
僅使用 UPDATE
語句更新 PostgreSQL 中的表
可以僅使用 UPDATE
語句來實現優化且更簡潔的方法,如下所示:
UPDATE produce AS p
SET price = s.produce_price
FROM shipment AS s
WHERE p.id = s.produce_id
輸出:
|id | price|
-----|-------
| 1 | 193|
| 2 | 41|
| 3 | 184|
| 4 | 192|
| 5 | 174|
| 6 | 122|
| 7 | 70|
| 8 | 130|
| 9 | 105|
| 10 | 176|