PostgreSQL 中的更新和連線語句

Joy Idialu 2023年1月30日 2022年5月14日
  1. 在 PostgreSQL 中生成發貨示例
  2. 使用 UPDATEJOIN 語句更新 PostgreSQL 中的表
  3. 僅使用 UPDATE 語句更新 PostgreSQL 中的表
PostgreSQL 中的更新和連線語句

本教程將引導你使用 UPDATEJOIN 語句更新表。

在 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

使用 UPDATEJOIN 語句更新 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|