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

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