SQL約束(主鍵約束 primary key、外來鍵約束 foreign key、唯一約束unique 、CHECK約束)
注意:
A.表中有資料不能建立約束
B.檢視下設定後,要點選儲存(只有儲存後在才看的到)
c 別忘了,點重新整理,才會出來呀!
1、主鍵約束 primary key
主鍵是每行的唯一識別符號,僅僅通過它就能準確定位到一行,其中主鍵列在整個表中不能有重複,必須包含唯一的值(不能為NULL)。
alter table t_group alter column id int not null --修改欄位型別 go
alter table t_group add constraint pk_group_Id --欄位建立主鍵約束 primary key(id) go
constraint [kənˈstrent] 約束
2、外來鍵約束 foreign key
外來鍵既能確保資料完整性,也能表現表之間的關係。添加了外來鍵之後,插入引用表的記錄要麼必須被引用表中被引用列的某條記錄匹配,要麼外來鍵列的值必須設定為NULL。
外來鍵和主鍵不一樣,每個表中的外來鍵數目不限制唯一性。在每個表中,每一有-~253個外來鍵。唯一的限制是一個列只能引用一個外來鍵。一個列可以被多個外來鍵引用。
如果表A的主關鍵字是表B中的欄位,則該欄位稱為表B的外來鍵,表A稱為主表,表B稱為從表。外來鍵是用來實現參照完整性的。
比如說:
create table t_group ( id int not null, name varchar(30), primary key (id) ); insert into t_group values (1, 'Group1'); insert into t_group values (2, 'Group2'); create table t_user ( id int not null, name varchar(30), groupid int, primary key (id), foreign key (groupid) references t_group(id) on delete cascade on update cascade ); insert into t_user values (1, 'qianxin', 1); --可以插入 insert into t_user values (2, 'yiyu', 2); --可以插入 insert into t_user values (3, 'dai', 3); --錯誤,無法插入,使用者組3不存在,與參照完整性約束不符 insert into t_user values (1, 'qianxin', 1); insert into t_user values (2, 'yiyu', 2); insert into t_user values (3, 'dai', 2); delete from t_group where id=2; --導致t_user中的2、3記錄級聯刪除 update t_group set id=2 where id=1; --導致t_user中的1記錄的groupid級聯修改為2
create table t_group ( id int not null, name varchar(30), primary key (id) ); insert into t_group values (1, 'Group1'); insert into t_group values (2, 'Group2'); create table t_user ( id int not null, name varchar(30), groupid int, primary key (id), foreign key (groupid) references t_group(id) on delete cascade on update cascade ); insert into t_user values (1, 'qianxin', 1); --可以插入 insert into t_user values (2, 'yiyu', 2); --可以插入 insert into t_user values (3, 'dai', 3); --錯誤,無法插入,使用者組3不存在,與參照完整性約束不符 insert into t_user values (1, 'qianxin', 1); insert into t_user values (2, 'yiyu', 2); insert into t_user values (3, 'dai', 2); delete from t_group where id=2; --導致t_user中的2、3記錄級聯刪除 update t_group set id=2 where id=1; --導致t_user中的1記錄的groupid級聯修改為2
3、唯一約束unique
指定列中的每個值必須是唯一的。可以多列唯一。
alter table Account
add constraint AK_AccountName --約束名
unique (Account_Name) -- 列名
alter table Account add constraint AK_AccountName --約束名 unique (Account_Name) -- 列名
補充:
1.主鍵約束(PRIMARY KEY) 1) 主鍵用於唯一地標識表中的每一條記錄,可以定義一列或多列為主鍵。 2) 是不可能(或很難)更新. 3) 主鍵列上沒有任何兩行具有相同值(即重複值),不允許空(NULL). 4) 主健可作外健,唯一索引不可; 2.唯一性約束(UNIQUE) 1) 唯一性約束用來限制不受主鍵約束的列上的資料的唯一性,用於作為訪問某行的可選手段,一個表上可以放置多個唯一性約束. 2) 只要唯一就可以更新. 3) 即表中任意兩行在 指定列上都不允許有相同的值,允許空(NULL). 4) 一個表上可以放置多個唯一性約束 3.唯一索引(INDEX) 建立唯一索引可以確保任何生成重複鍵值的嘗試都會失敗。 唯一性約束和主鍵約束的區別: (1).唯一性約束允許在該列上存在NULL值,而主鍵約束的限制更為嚴格,不但不允許有重複,而且也不允許有空值。 (2).在建立唯一性約束和主鍵約束時可以建立聚集索引和非聚集索引,但在 預設情況下主鍵約束產生聚集索引,而唯一性約束產生非聚集索引 約束和索引, 前者是用來檢查資料的正確性,後者用來實現資料查詢的優化,目的不同。 唯一性約束與唯一索引有所不同: (1).建立唯一約束會在Oracle中建立一個Constraint,同時也會建立一個該約束對應的唯一索引。 (2).建立唯一索引只會建立一個唯一索引,不會建立Constraint。 也就是說其實唯一約束是通過建立唯一索引來實現的。 在刪除時這兩者也有一定的區別: 刪除唯一約束時可以只刪除約束而不刪除對應的索引,所以對應的列還是必須唯一的, 而刪除了唯一索引的話就可以插入不唯一的值。
4、CHECK約束
CHECK約束約束可以和一個列關聯,也可以和一個表關聯,因為它們可以檢查一個列的值相對於另外一個列的值,只要這些列都在同一個表中以及值是在更新或者插入的同一行中。CHECK約束還可以用於檢查列值組合是否滿足某一個標準。
可以像使用where子句一樣的規則來定義CHECK約束。CHECK約束條件的示例如下:
目標 |
SQL |
限制Month列為合適的數字 |
BETWEEN 1 AND 12 |
正確的SSN格式 |
LIKE'[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' |
限制為一個快遞公司的特定列表 |
IN('UPS','Fed Ex',EMS') |
價格必須為正數 |
UnitPrice >= 0 |
引用同一行中的另外一列 |
ShipDate >= OrderDate |
上面給出的列表只是一小部分,而條件實際上市無限多的。幾乎所有可以放到where子句的條件都可以放到該約束中。而且和其他選擇(規則和觸發器)相比,CHECK約束執行速度更快。
在已存在的表中新增一個CHECK約束:
alter table Account
add constraint CN_AccountAge
check
(Account_Age > 18); -- 插入年齡必須大於18
如果此時檢視新增一條不滿足的記錄,將報如下錯誤:
insert into Accountvalues (22,'洪',17)
訊息547,級別16,狀態0,第1 行
INSERT 語句與 CHECK 約束"CN_AccountAge"衝突。該衝突發生於資料庫"Nx",表"dbo.Account", column 'Account_Age'。
語句已終止。
5、DEFAULT約束
DEFAULT約束在INSERT INTO語句沒有為列指定值的時候提供一個預設值。
示例
例如,以下SQL建立了一個名為CUSTOMERS的表,包含5個列。其中,SALARY列的預設值為5000.00,如果INSERT INTO語句沒有為該列指定值,將會使用預設的5000.00。
CREATE TABLE CUSTOMERS( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25) , SALARY DECIMAL (18, 2) DEFAULT 5000.00, PRIMARY KEY PRIMARY KEY (ID) );
如果該表已經存在,你可以使用類似以下的語句為SALARY列新增一個NOT NULL約束:
ALTER TABLE CUSTOMERS MODIFY SALARY DECIMAL (18, 2) DEFAULT 5000.00;
刪除預設約束
使用以下SQL刪除DEFAULT約束:
ALTER TABLE CUSTOMERS ALTER COLUMN SALARY DROP DEFAULT;
禁用約束
ALTER TABLE CUSTOMERS
WITHNOCHECK ------- 臨時禁用約束
ADD CONSTRAINT
CHECK ........