成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PostgreSQL 17新特性之MERGE語(yǔ)句增強(qiáng)

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

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

PostgreSQL 17 進(jìn)一步增強(qiáng)了該語(yǔ)句的功能,包括:

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

RETURNING 子句

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

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

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

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

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

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

接下來(lái)是更新數(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

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

如果只需要返回目標(biāo)表中更新后的數(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

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

除此之外,新版本還增加了一個(gè) 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 條記錄,其中一條在目標(biāo)表中執(zhí)行了 INSERT 操作,另一條執(zhí)行了 UPDATE 操作。

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

WHEN NOT MATCHED BY SOURCE

PostgreSQL 17 還為 MERGE 語(yǔ)句增加了一個(gè)新的操作選項(xiàng):WHEN NOT MATCHED BY SOURCE。該選項(xiàng)可以針對(duì)目標(biāo)表中存在、但是源表中不存在的數(shù)據(jù)行進(jìn)行操作,允許的操作包括 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 條記錄,目標(biāo)表存在 2 條記錄,我們刪除了目標(biāo)表中多出的一條數(shù)據(jù)( tag = ‘sql’)。

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

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


責(zé)任編輯:華軒 來(lái)源: SQL編程思想
相關(guān)推薦

2012-05-18 14:36:50

Fedora 17桌面環(huán)境

2023-06-07 07:30:34

iPadOS 17蘋果

2009-06-16 11:24:00

HTTP增強(qiáng)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

2012-05-21 14:16:36

Fedora17新特性

2024-02-04 15:58:53

C++ 17編程代碼

2011-08-19 10:40:27

SQL Server Merge命令

2010-01-11 10:08:14

Oracle 11g

2018-09-19 16:15:18

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

2013-05-20 10:25:45

vSphere 5.1vMotion

2017-01-09 16:25:55

Android Shortcuts系統(tǒng)

2009-08-03 18:34:43

TuplizersNHibernate

2009-08-18 09:37:42

ASP.NET 4.0

2009-03-10 10:31:26

DB2XMLpureXML

2012-01-12 16:16:20

Fedora 17特性規(guī)劃

2009-07-08 09:47:49

Scala 2.8Scala

2011-05-20 09:35:22

JDK7

2012-07-02 10:43:49

JVMGroovyJava
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美激情一区二区 | 日韩中文字幕在线观看 | 99在线视频观看 | 国产精品久久久久久久久 | 亚洲精选一区 | 草草视频在线观看 | 观看av | 亚洲精品久久久久久久久久吃药 | 精品av天堂毛片久久久借种 | 国产在线不卡视频 | 欧美精品1区2区3区 精品国产欧美一区二区 | 欧美美乳 | 日韩α片| 日批日韩在线观看 | 久久久久久久久久久丰满 | 欧美激情精品久久久久 | 99综合在线 | 国产精品免费在线 | 精品无码久久久久久国产 | 999视频在线播放 | 国产精品18久久久久久白浆动漫 | 国产1区2区在线观看 | 欧美成人免费在线视频 | 精品欧美乱码久久久久久 | 欧美日韩国产在线观看 | 亚洲精品一区二区冲田杏梨 | 北条麻妃av一区二区三区 | 免费看啪啪网站 | 国产精品污污视频 | 国产欧美精品一区二区色综合 | 亚洲成人中文字幕 | 精品欧美一区二区三区久久久 | 日本天堂视频 | 精品欧美一区免费观看α√ | 国产免费一区二区三区 | 中文字幕一区二区三区四区 | 91久久国产综合久久 | 精品国产一区二区三区性色av | 秋霞电影一区二区 | 国产精品性做久久久久久 | 在线观看亚洲精品视频 |