1. 程式人生 > >SQL約束(主鍵約束 primary key、外來鍵約束 foreign key、唯一約束unique 、CHECK約束)

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  ........