創建基本表的同時,還可以指定表中數據完整性約束,例如在創建基本表時,通過分析可以得到如下結論:
不同倉庫必須有不同的w_id,且w_id不能為NULL。倉庫必須有具體的名稱數據庫引用完整性約束,不能為NULL。倉庫所在的街區地址長度不能為0。倉庫所在國家默認為“CN”。
因此可以在創建基本表時指定這些約束。
例1:創建帶有完整性約束的基本表,語句如下:
CREATE TABLE warehouse
(
w_id SMALLINT PRIMARY KEY,
w_name VARCHAR(10) NOT NULL,
w_street_1 VARCHAR(20) CHECK(LENGTH(w_street_1)<>0),
w_street_2 VARCHAR(20) CHECK(LENGTH(w_street_1)<>0),
w_city VARCHAR(20),
w_state CHAR(2) DEFAULT 'CN',
w_zip CHAR(9),
w_tax DECIMAL(4,2),
w_ytd DECIMAL(12,2)
);
如果向基本表中寫入不符合完整性約束的值,那么數據不能被寫入數據庫引用完整性約束,數據庫會提示錯誤。
例2:向列中寫入NULL值,不符合完整性約束,寫入數據時會報錯,數據寫入不成功,語句如下:
INSERT INTO warehouse VALUES(1,NULL,'','',NULL,'CN',NULL,1.0,1.0);
ERROR: null value in column "w_name" violates not-null constraint
DETAIL: Failing row contains (1, null, null, null, null, CN, null, 1.00, 1.00).
除了在列定義之后指定完整性約束之外,還可以使用表級的完整性約束來指定。
例3:在表定義上指定完整性約束,NULL約束只能在列定義上指定:
CREATE TABLE warehouse
(
w_id SMALLINT,
w_name VARCHAR(10) NOT NULL, --設置NULL約束
w_street_1 VARCHAR(20),
w_street_2 VARCHAR(20),
w_city VARCHAR(20),
w_state CHAR(2) DEFAULT 'CN', --設置默認值
w_zip CHAR(9),
w_tax DECIMAL(4,2),
w_ytd DECIMAL(12,2),
CONSTRAINT w_id_pkey PRIMARY KEY(w_id), --增加主鍵約束
CONSTRAINT w_street_1_chk CHECK(LENGTH(w_street_1) < 100), --增加CHECK約束
CONSTRAINT w_street_2_chk CHECK(LENGTH(w_street_2) < 100), --增加CHECK約束
);
當一個表中的某一列或多列恰好引用的是另一個表的主鍵(或具有唯一性)時,可以將其定義為外鍵,外鍵表示兩個表之間相互的關聯關系。外鍵的定義可以直接在屬性上定義,也可以在基本表的創建語句中定義。
例4:在新訂單表中引用倉庫表的列稱為外鍵,語句如下:
CREATE TABLE new_orders
(
no_o_id INTEGER NOT NULL,
no_d_id SMALLINT NOT NULL,
no_w_id SMALLINT NOT NULL REFERENCE warehouse(w_id)
);
還可以通過ALTER TABLE語句對完整性約束進行修改。
例5:在表中增加主鍵列:
ALTER TABLE warehouse ADD PRIMARY KEY(w_id);
例6:在表中增加CHECK約束:
ALTER TABLE warehouse ADD CHECK(LENGTH(w_street_1) < 100);
例7:在表中增加外鍵引用:
ALTER TABLE warehouse ADD FOREIGN KEY(no_w_id) REFERENCES warehouse(w_id);
例8:在表中增加唯一列:
ALTER TABLE new_orders ADD UNIQUE(no_o_id, no_d_id, no_w_id);