CockroachDB SQL開發基礎 ——建立表的更多有趣示例 (2)
在上一篇文章中,介紹了CockroachDB中建立表的更多一些示例,包括:“主鍵”、“外來鍵”、“Check約束”這些SQL標準中的特性用法;還結合示例介紹瞭如何建立帶有計算列和能夠對映KV儲存表的方法。本文將介紹CockroachDB中建立表時的另外一些示例,包括:建立帶有二級索引和倒排索引的表、建立帶有ID值自動生成的表(3種方式)、從Select語句建立表以及建立具有多列族的表(這是CRDB自己的擴充套件)。
1. 建立帶有二級索引和倒排索引的表
在CRDB中,能夠在建立表的同時建立二級索引或倒排索引。二級索引就是傳統資料庫中的非主鍵索引;在CRDB中倒排索引用於為型別是JSON的欄位建立索引,以提高在JSON型別欄位上檢索的效能。
我們看一個例子,這個例子還綜合了先前介紹的檢查約束和預設值等特性:
CREATE TABLE product_information(
product_id INT PRIMARY KEY,
product_name STRING(50) UNIQUE NOT NULL,
product_description STRING(2000),
category_id STRING(1) NOT NULL CHECK (category_id IN ('A','B','C')),
weight_class INT,
warranty_period INT CHECK (warranty_period BETWEEN 0 AND 24),
supplier_id INT,
product_status STRING(20),
list_price DECIMAL(8,2),
min_price DECIMAL(8,2),
catalog_url STRING(50) UNIQUE,
date_added DATE DEFAULT CURRENT_DATE(),
misc JSONB,
CONSTRAINT price_check CHECK (list_price >= min_price),
INDEX date_added_idx (date_added),
INDEX supp_id_prod_status_idx (supplier_id, product_status),
INVERTED INDEX details (misc)
);
在建立表之後,我們可以查看錶上建立的索引:
SHOW INDEX FROM product_information;
2. 從Select語句建立表
可以執行CREATE TABLE AS語句從SELECT FROM語句執行的結果集建立一個表。讓看如下的示例:
CREATE TABLE customers_ny AS SELECT * FROM customers WHERE state = 'NY';
3. 建立帶有自動生成ID值的表
在CRDB中,建立帶有自動生成ID值的表有三種方式,下面我們就結合示例說明這三種方式的用法:
(1) 使用UUID列,並以gen_random_uuid()作為其預設值:
CREATE TABLE t1 (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),name STRING);
INSERT INTO t1 (name) VALUES ('a'), ('b'), ('c');
SELECT * FROM t1;
查詢結果如下圖:
(2) 使用SERIAL資料型別
在CRDB中,SERIAL資料型別實際是INT型別並帶有unique_rowid()函式作為缺 省值)的別名。我們看如下示例:
CREATE TABLE t2 (id SERIAL PRIMARY KEY, name STRING);
實際上相當於:
CREATE TABLE t21 (id INT PRIMARY KEY DEFAULT unique_rowid(), name STRING);
INSERT INTO t2 (name) VALUES ('a'), ('b'), ('c');
SELECT * FROM t2;
查詢結果如下圖:
(3) 使用SEQUENCE物件
我們看如下示例:
CREATE SEQUENCE customer_seq;
CREATE TABLE customer_list (id INT PRIMARY KEY DEFAULT nextval('customer_seq'),
customer string,
address string
);
INSERT INTO customer_list (customer, address) VALUES
('Lauren', '123 Main Street'),('Jesse', '456 Broad Ave'),('Amruta', '9876 Green Parkway');
SELECT * FROM customer_list;
查詢結果如下圖:
4. 建立具有多列族的表
當我們在CRDB中建立一個表時,表的所有列都被儲存在底層KV儲存的一個列族中。這種預設方式在大多上情況下是高效的。但是,當頻繁更新的列與很少更新的列在同一個列族中時,很少更新的列也會在每次更新時被重寫。特別是當很少進行更新的列長度比較大時,把它們拆分放在另外的列族中是一種更好的方式。
為了在表建立時,指定不同的列族,需要使用FAMILY關鍵字,我們看一個示例:
CREATE TABLE test(
id INT PRIMARY KEY,
last_accessed TIMESTAMP,
data BYTES,
FAMILY f1 (id, last_accessed),
FAMILY f2 (data)
);
在test表中,data欄位用來儲存blob資料,last_accessed欄位用來儲存資料被最近一次訪問的時間戳(這個欄位的值會比較頻繁地更新)。由於blob資料一般來說很少改變,所以我們把這兩種不同訪問特點的欄位分別放在兩個列族中。這種方式可以看作“行列混合”的表。
參考連結:
https://www.cockroachlabs.com/docs/stable/create-table.html
https://www.cockroachlabs.com/docs/stable/column-families.html