1. 程式人生 > >CockroachDB SQL開發基礎 ——建立表的更多有趣示例 (2)

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

    https://www.cockroachlabs.com/docs/stable/sql-faqs.html#how-do-i-auto-generate-unique-row-ids-in-cockroachdb