自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PostgreSQL 17新特性之MERGE語句增強

數(shù)據(jù)庫 PostgreSQL
PostgreSQL 15 提供了 MERGE 語句,它可以基于源表或者查詢結果更新目標表中的數(shù)據(jù)。MERGE 可以在單個語句中實現(xiàn) INSERT、UPDATE 以及 DELETE 操作。

PostgreSQL 15 提供了 MERGE 語句,它可以基于源表或者查詢結果更新目標表中的數(shù)據(jù)。MERGE 可以在單個語句中實現(xiàn) INSERT、UPDATE 以及 DELETE 操作。

PostgreSQL 17 進一步增強了該語句的功能,包括:

  • 支持 RETURNING 子句,可以返回新增、更新或者刪除的數(shù)據(jù)行;
  • 支持 WHEN NOT MATCHED BY SOURCE 操作,用于操作源表中不存在但是目標表中存在的數(shù)據(jù)行。

RETURNING 子句

PostgreSQL 支持 INSERT、UPDATE 以及 DELETE 語句的 RETURNING 子句,用于返回新增、更新或者刪除的數(shù)據(jù)行。新版本則為 MERGE 語句提供了相同的功能。

我們先創(chuàng)建一個測試表:

CREATE TABLE test (
    id    INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    tag   VARCHAR(10) NOT NULL UNIQUE,
    posts INT NOT NULL DEFAULT 0
);

然后測試一下 MERGE 語句新增數(shù)據(jù)時的操作:

MERGE INTO test t
USING (VALUES ('pg17')) AS s(tag)
ON t.tag = s.tag
WHEN MATCHED THEN
    UPDATE SET posts = posts + 1
WHEN NOT MATCHED THEN
    INSERT (tag, posts) VALUES (s.tag, 1)
RETURNING *;

  tag   | id | tag      | posts 
--------+----+----------+-------------
 pg17   |  1 | pg17     |           1

對于 INSERT 操作,RETURNING 返回了插入之后的數(shù)據(jù)。同時,RETURNING * 還返回了源表中的數(shù)據(jù)。

接下來是更新數(shù)據(jù)的操作:

MERGE INTO test t
USING (VALUES ('pg17')) AS s(tag)
ON t.tag = s.tag
WHEN MATCHED THEN
    UPDATE SET posts = posts + 1
WHEN NOT MATCHED THEN
    INSERT (tag, posts) VALUES (s.tag, 1)
RETURNING *;
  tag   | id | tag      | posts 
--------+----+----------+-------------
 pg17   |  1 | pg17     |           2

對于 UPDATE 操作,RETURNING 返回了更新之后的數(shù)據(jù)。

如果只需要返回目標表中更新后的數(shù)據(jù),可以使用 RETURNING t.*:

MERGE INTO test t
USING (VALUES ('pg17')) AS s(tag)
ON t.tag = s.tag
WHEN MATCHED THEN
    UPDATE SET posts = posts + 1
WHEN NOT MATCHED THEN
    INSERT (tag, posts) VALUES (s.tag, 1)
RETURNING t.*;
 id | tag      | posts 
----+----------+-------------
  1 | pg17     |           2

提示:對于 DELETE 操作,RETURNING 返回刪除之前的數(shù)據(jù)。

除此之外,新版本還增加了一個 merge_action() 函數(shù),用于返回 MERGE 操作類型。函數(shù)的返回值包括 INSERT、UPDATE 以及 DELETE。例如:

MERGE INTO test t
USING (VALUES ('sql'),('pg17')) AS s(tag)
ON t.tag = s.tag
WHEN MATCHED THEN
    UPDATE SET posts = posts + 1
WHEN NOT MATCHED THEN
    INSERT (tag, posts) VALUES (s.tag, 1)
RETURNING t.*, merge_action();
 id | tag      | posts       | merge_action 
----+----------+-------------+--------------
  2 | sql      |           1 | INSERT
  1 | pg17     |           4 | UPDATE

源表提供了 2 條記錄,其中一條在目標表中執(zhí)行了 INSERT 操作,另一條執(zhí)行了 UPDATE 操作。

merge_action() 函數(shù)只能用于 MERGE 語句的 RETURNING 字段列表。

WHEN NOT MATCHED BY SOURCE

PostgreSQL 17 還為 MERGE 語句增加了一個新的操作選項:WHEN NOT MATCHED BY SOURCE。該選項可以針對目標表中存在、但是源表中不存在的數(shù)據(jù)行進行操作,允許的操作包括 UPDATE、DELETE 或者 DO NOTHING。

例如:

MERGE INTO test t
USING (VALUES ('pg17')) AS s(tag)
ON t.tag = s.tag
WHEN MATCHED THEN
    UPDATE SET posts = posts + 1
WHEN NOT MATCHED THEN
    INSERT (tag, posts) VALUES (s.tag, 1)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;

SELECT * FROM test;
 id | username | touch_count 
----+----------+-------------
  1 | pg17     |           5

源表只提供了 1 條記錄,目標表存在 2 條記錄,我們刪除了目標表中多出的一條數(shù)據(jù)( tag = ‘sql’)。

默認的 WHEN NOT MATCHED 選項等價于 WHEN NOT MATCHED BY TARGET,用于針對源表中存在、但是目標表中不存在的數(shù)據(jù)行進行操作,允許的操作包括 INSERT 或者 DO NOTHING。

以前我們做數(shù)據(jù) ETL 時,考慮到源表數(shù)據(jù)可能被刪除,這時候目標表也需要做相同的操作,需要增加額外的 DELETE 語句,新版本 PostgreSQL 只需要一個 MERGE 語句解決增刪改問題,完美!


責任編輯:華軒 來源: SQL編程思想
相關推薦

2023-06-07 07:30:34

iPadOS 17蘋果

2012-05-18 14:36:50

Fedora 17桌面環(huán)境

2009-06-16 11:24:00

HTTP增強Java SE 6新特

2009-02-09 09:38:41

新特性MySQL 6.0MySQL

2021-05-21 09:34:40

React React 17前端

2022-09-22 07:03:15

Java 18LTSOracle

2011-08-19 10:40:27

SQL Server Merge命令

2012-05-21 14:16:36

Fedora17新特性

2024-02-04 15:58:53

C++ 17編程代碼

2010-01-11 10:08:14

Oracle 11g

2009-08-03 18:34:43

TuplizersNHibernate

2017-01-09 16:25:55

Android Shortcuts系統(tǒng)

2013-05-20 10:25:45

vSphere 5.1vMotion

2018-09-19 16:15:18

MySQL直方圖數(shù)據(jù)庫

2012-01-12 16:16:20

Fedora 17特性規(guī)劃

2009-08-18 09:37:42

ASP.NET 4.0

2009-03-10 10:31:26

DB2XMLpureXML

2011-03-24 09:22:36

Java 7JDBC4

2011-05-20 09:43:23

JDK7

2009-07-08 09:47:49

Scala 2.8Scala
點贊
收藏

51CTO技術棧公眾號