CockroachDB SQL開發基礎 ——增刪改查 (2)
在上一篇文章中介紹了應用開發人員在開發資料庫訪問邏輯時最頻繁使用DML語句的用法和示例,包括:INSERT、UPDATE、DELETE和SELECT等語句。這篇文章將向大家介紹UPSERT、WITH等語句的用法。
1. UPSERT語句
在CRDB中,UPSERT語句是“精簡版的”INSERT ON CONFLICT(前一篇文章有描述)。當待插入行中的值沒有違反表的主鍵約束時,插入這個記錄;如果違背了,那麼就更新相應的記錄。下面我們結合一些示例進行說明:
(1) UPSERT單行(沒有主鍵衝突)
在CRDB中,可以使用UPSERT語句向一個表插入或更新資料。例如:
CREATE TABLE accounts(
id INT PRIMARY KEY ,
name VARCHAR(30),
balance DECIMAL(15,2)
);
UPSERT INTO accounts VALUES (1, 'user11', 1000.25);
UPSERT INTO accounts VALUES (2, 'user22', 2000.75);
SELECT * FROM accounts;
如下圖所示:
建立完表之後,由於還有記錄,所以執行上面的兩條UPSERT語句都是插入記錄到表中。
(2) UPSERT單行(有主鍵衝突)
例如:
UPSERT INTO accounts VALUES (2,'user22',3500.10);
SELECT * FROM accounts;
如下圖所示:
由於上面的UPSERT語句插入的記錄(id=2)已經存在,所以對存在記錄進行更新。
(3) UPSERT多行(沒有主鍵衝突)
例如:
UPSERT INTO accounts VALUES (3,'user33',3500.10),(4,'user44',4000.35);
SELECT * FROM accounts;
如下圖所示:
(4) UPSERT 多行(有主鍵衝突)
我們看如下的例子:
UPSERT INTO accounts VALUES (4,'user44',3500.10) , (5,'user55',4800.35);
SELECT * FROM accounts ;
輸出如下圖所示:
2. 使用WITH定義公共Table表示式
從CRDB 2.0版本開始支援“Common Table Expressions”(簡稱CTE),CTE能夠為一個複雜的查詢定義一個別名,然後可以在查詢語句中使用。我們還是通過例子來進行說明:
WITH o AS (SELECT * FROM orders WHERE id IN (33, 542, 112))
SELECT *
FROM customers AS c, o
WHERE o.customer_id = c.id;
上面的語句與如下的語句等價,但是使用WITH 定義CTE更容易閱讀,特別是對於比較複雜的查詢語句:
SELECT *
FROM customers AS c, ( SELECT * FROM orders WHERE id IN (33, 542, 112) ) AS o
WHERE o.customer_id = c.id;
參考:
https://www.cockroachlabs.com/docs/stable/upsert.html
https://www.cockroachlabs.com/docs/stable/common-table-expressions.html