CockroachDB SQL開發基礎 ——建立表的更多有趣示例 (1)
上一篇文章介紹了CockroachDB中建立資料庫和表的基本方法和示例。在這些示例中使用的CRDB語句的語法也能夠用於其它的資料庫(比如MySQL或者相容MySQL的PingCap的TiDB)。 CockroachDB在SQL標準的遵從和實現度方面,在開源NewSQL/HTAP資料庫中是比較領先的(相比較來說,TiDB在SQL標準的支援方面要稍弱一些)。
本文將介紹在建立表時的更多示例,包括“主鍵”、“外來鍵”、“Check約束”這些SQL標準中的特性用法;還有建立帶有計算列和能夠對映KV儲存的表。CRDB也支援表分割槽特性(企業版支援),這將在後續文章中描述。此外,CRDB也對CREATE TABLE語句進行了擴充套件,能夠支援“多列族定義”,這也會在後續文章中介紹。
1. 主鍵和外來鍵
(1) 建立沒有主鍵表
在CRDB中,表必須具有主鍵。如果在建立表的時候沒有指定主鍵,那麼CRDB會 自動建立一個隱含列作為主鍵。這個隱含列的名稱叫做rowid,它的型別是INT,其值 由unique_rowid()系統函式自動生成。
我們看一個例子:
CREATE TABLE logon (
user_id INT,
logon_date DATE
);
在建立了logon表之後,執行如下語句檢視列的情況:
SHOW COLUMNS FROM logon;
由於CRDB對於主鍵會自動建立一個索引,所以我們執行如下語句:
SHOW INDEX FROM logon;
由上圖我們可以看到,CRDB為沒有定義主鍵的表自動建立了主鍵的情況。
(2)建立具有主鍵和外來鍵的表
我們通過例子加以說明:
CREATE TABLE customers( --建立"父表"
id INT PRIMARY KEY,
name VARCHAR(30)
);
CREATE TABLE orders( --建立"子表"
id INT PRIMARY KEY,
customer_id INT REFERENCES customers(id) ON DELETE CASCADE
);
在成功建立表之後,我們執行如下語句查看錶定義:
SHOW CREATE TABLE orders
輸出如下圖:
2. Check約束
CRDB支援SQL標準中的Check約束,包括欄位級的約束和表級的約束。讓我們兩個示例:
--欄位級Check約束定義
CREATE TABLE inventories (
product_id INT NOT NULL,
warehouse_id INT NOT NULL,
quantity_on_hand INT NOT NULL CHECK (quantity_on_hand > 0),
PRIMARY KEY (product_id, warehouse_id)
);
--表級Check約束
CREATE TABLE inventories (
product_id INT NOT NULL,
warehouse_id INT NOT NULL,
quantity_on_hand INT NOT NULL,
PRIMARY KEY (product_id, warehouse_id),
CONSTRAINT ok_to_supply CHECK (quantity_on_hand > 0 AND warehouse_id BETWEEN 100 AND 200)
);
3. 建立具有計算列的表
還是看一個示例來了解CRDB的這個特性:
CREATE TABLE names(
id INT PRIMARY KEY,
first_name STRING,
last_name STRING,
full_name STRING AS (CONCAT(first_name, ' ', last_name)) STORED
);
在上面的示例中,fulle_name欄位就是“計算列”。在向這個表插入資料時,不需 要為這個欄位指定值,CRDB會自動根據計算列定義的計算規則為其生成值並存儲。 當然,我們也可以通過檢視來生成“計算列”,但是它不會儲存。
INSERT INTO names (id, first_name, last_name) VALUES (1, 'Lola', 'McDog'), (2, 'Carl', 'Kimball'), (3, 'Ernie', 'Narayan');
SELECT * FROM names;
4. 建立對映KV儲存的表
CRDB是一個構建在事務化的、強一致性KV儲存上的分散式NewSQL資料庫。雖 然我們不能直接訪問這個KV儲存,你能夠通過建立一個只有兩個欄位的表作為“映 射”,實現對KV儲存的訪問。我們看一個示例:
CREATE TABLE kv (k INT PRIMARY KEY, v BYTES);
如果這樣的表沒有其它索引和外來鍵定義的話,那麼在執行INSERT、UPSERT、 UPDATE、DELETE等語句時,CRDB會有最小的開銷(官方文件中描述只有百分之幾 的開銷)。下面是一個UPSERT語句的示例:
UPSERT INTO kv VALUES (1, b'hello')
這種機制為開發人員提供了便捷的能夠訪問KV儲存的SQL介面,並且能夠支援事務。
參考連結:
https://www.cockroachlabs.com/docs/stable/create-table.html