CHECK
限制可讓您指定一或多個資料欄的值必須符合布林運算式。本頁說明如何在 GoogleSQL 方言資料庫和 PostgreSQL 方言資料庫中新增及管理這類限制。
在新的資料表中新增檢查限制
在以下 CREATE TABLE
程式碼片段中,我們會建立資料表來儲存音樂會相關資訊。為了要求音樂會的結束時間晚於開始時間,我們加入了檢查限制。
GoogleSQL
CREATE TABLE Concerts (
ConcertId INT64,
StartTime Timestamp,
EndTime Timestamp,
CONSTRAINT start_before_end CHECK(StartTime < EndTime),
) PRIMARY KEY (ConcertId);
PostgreSQL
CREATE TABLE Concerts (
ConcertId BIGINT,
StartTime TIMESTAMPTZ,
EndTime TIMESTAMPTZ,
CONSTRAINT start_before_end CHECK(StartTime < EndTime),
PRIMARY KEY (ConcertId)
);
限制定義以 CONSTRAINT
關鍵字開頭。我們在本例中明確命名限制條件 start_before_end
,方便您在錯誤訊息中找到該限制條件,以及在需要參照該限制條件時使用。如果未提供名稱,Spanner 會提供一個,產生的名稱會以前置字串 CK_
開頭。限制名稱的範圍為結構定義,並與資料表和索引的名稱相同,且在結構定義中不得重複。檢查限制條件定義包含關鍵字 CHECK
,後面接著括號中的運算式。運算式只能參照這個資料表的欄位。在這個範例中,它會參照 StartTime 和 EndTime,而檢查限制會確保音樂會的開始時間一律早於結束時間。
插入新資料列或更新現有資料列的 StartTime
或 EndTime
時,系統會評估檢查限制運算式的值。如果運算式評估為 TRUE
或 NULL
,檢查限制會允許資料變更。如果運算式評估為 FALSE
,則不允許變更資料。
以下限制適用於檢查限制
expression
項。運算式只能參照同一個資料表中的欄。
運算式必須直接或透過參照非產生資料欄的產生資料欄,參照至少一個非產生資料欄。
運算式無法參照已設定
allow_commit_timestamp
選項的資料欄。運算式不得包含子查詢。
運算式不得包含非確定性函式,例如
CURRENT_DATE()
和CURRENT_TIMESTAMP()
。
在現有資料表中新增檢查限制
我們使用以下 ALTER TABLE
陳述式,新增限制條件,確保所有演唱會 ID 都大於零。
ALTER TABLE Concerts
ADD CONSTRAINT concert_id_gt_0 CHECK (ConcertId > 0);
我們再次為限制指定名稱 concert_id_gt_0。將 CHECK
限制條件新增至現有資料表後,系統會立即開始對新資料強制執行限制條件,並啟動長時間執行的作業,驗證現有資料是否符合新限制條件。由於這項驗證作業是透過長時間執行的作業執行,因此不會影響表格中的持續性交易。詳情請參閱「結構定義更新效能」。如果現有資料有任何違規情形,系統會回復限制。
移除檢查限制
下列 DDL 陳述式會從 Concerts
資料表中刪除 CHECK
限制。
ALTER TABLE Concerts
DROP CONSTRAINT concert_id_gt_0;
修改檢查約束條件運算式
系統不允許修改 CHECK
限制的運算式。您必須放棄現有的限制條件,並使用新運算式建立新的限制條件。
查看檢查約束條件的屬性
Spanner 的 INFORMATION_SCHEMA 包含資料庫的檢查限制相關資訊。以下列舉幾個您可以透過查詢資訊結構定義來回答的問題。
資料庫中定義了哪些檢查限制?
SELECT tc.CONSTRAINT_NAME, tc.TABLE_NAME, tc.CONSTRAINT_TYPE
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc
WHERE tc.CONSTRAINT_TYPE = 'CHECK';
資料庫中的檢查限制目前處於何種狀態?
如果您已在現有資料表中新增檢查限制,建議您查看其目前狀態,以便判斷所有現有資料是否已根據限制進行驗證。如果 SPANNER_STATE
在下列查詢中傳回 VALIDATING_DATA
,表示 Spanner 仍在根據該限制驗證現有資料。
SELECT cc.CONSTRAINT_NAME, cc.SPANNER_STATE
FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS as cc;
後續步驟
- 進一步瞭解 Spanner 的 INFORMATION SCHEMA。