ALTER TABLE ... ENABLE/DISABLE CONSTRAINT命令用於啟用或禁用約束。
前提條件
- 在shared_preload_libraries參數中添加polar_constraint外掛程式。
- 核心版本為V1.1.11及以上,升級核心版本,請參見版本管理。
- 手動升級到V1.1.11核心版本的叢集需要安裝polar_constraint外掛程式,命令如下:
CREATE EXTENSION IF NOT EXISTS polar_constraint;
文法
ALTER TABLE table_name ADD CONSTRAINT constraint_name DISABLE;
為表
table_name
添加一個約束,約束constraint_name
為禁用狀態,即對當前表中的資料和新插入的資料都不起作用。目前該文法支援如下四種類型的約束:
- 主鍵約束
- 唯一性限制式
- 外鍵約束
- CHECK約束
ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
修改約束為啟用狀態。預設情況下會檢查當前表中的資料是否匹配目標約束,如果不匹配,則輸出表中資料有衝突的錯誤。
說明 如果是外鍵約束,並且與另一個表的主鍵約束或唯一性限制式相對應,在啟用外鍵約束前,需要檢查當前外鍵約束關聯的主鍵約束或唯一性限制式是否處於啟用狀態,如果是啟用狀態則可以正常啟用外鍵約束,反之則報錯。ALTER TABLE table_name ENABLE CONSTRAINT constraint_name NOT VALID;
修改約束為啟用狀態,但是不檢查當前表中的資料是否匹配修改的目標約束。
ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;
修改約束為禁用狀態。禁用後,約束將不再起作用。
說明 如果約束是主鍵約束或唯一性限制式,這兩類約束可能被其他對象引用。例如主鍵約束被另一個表的外鍵約束引用,那麼當外鍵約束沒有被禁用或刪除的情況下,主鍵約束無法被禁用的。
樣本
建立一個表。
CREATE TABLE aa(a1 INT);
CREATE TABLE
建立一個約束,要求a1列的值必須大於10,約束初始化為禁用狀態。
ALTER TABLE aa ADD CONSTRAINT aa_a1_check CHECK(a1>10) DISABLE;
ALTER TABLE
插入一個不符合約束條件的值,由於約束處于禁用狀態,可以正常插入。
INSERT INTO aa VALUES (10);
INSERT 0 1
啟用約束並檢查現有資料是否符合約束,由於表中存在不符合約束條件的資料,故產生報錯。
ALTER TABLE aa ENABLE CONSTRAINT aa_a1_check;
ERROR: check constraint "aa_a1_check" is violated by some row
啟用約束不檢查現有資料是否符合約束。
ALTER TABLE aa ENABLE CONSTRAINT aa_a1_check NOT VALID;
ALTER TABLE
插入不符合約束條件的資料,產生報錯。
INSERT INTO aa VALUES (10);
ERROR: new row for relation "aa" violates check constraint "aa_a1_check"
DETAIL: Failing row contains (10).