SQL新增外來鍵約束

2021-09-12 13:44:57 字數 3834 閱讀 4790

--1,sql語句建立表的同時新增外來鍵約束

create table tb_userandrole  --使用者角色表

(  id int primary key identity(1,1),

userid int not null,--使用者id

roleid int not null,--角色id

foreign key(userid) references tb_users(id)--tb_users表的id作為tb_userandrole表的外來鍵

)   --2、新增外來鍵約束(關聯欄位要用括號括起來)

-- alter table 從表

-- add constraint 約束名 foreign key (關聯字段) references 主表(關聯字段);

--例如:

alter table tb_userandrole

add constraint fk__tb_uandr_role foreign key (roleid) references tb_role(id);

alter table table1  add constraint emp_dept_fk foreign key (department_id)

references table2(department_id);

table1是子表,table2是父表。 沒錯。

table2的department_id 應該是 主鍵, 或者 有唯一約束的列。

外來鍵是table1子表上的。

也就是 子表 table1.department_id 中的資料, 必須在 table2的department_id 那裡要有。

如果沒有, 那麼

如果你 insert into table1 乙個 table2 沒有的 department_id

那麼 資料庫將 拒絕你的插入操作。

alter table 子表 add constraint 外鍵名 foreign key (關聯字段) 

references 主表(被關聯的字段) on delete cascade on update restrict;

外來鍵約束屬性:當有刪除或者更新操作的時候發出這個約束

on delete和on update都有restrict,no action, cascade,set null屬性。現在分別對他們的屬性含義做個解釋。

on delete

restrict(約束):當在父表(即外來鍵的**表)中刪除對應記錄時,首先檢查該記錄是否有對應外來鍵,如果有則不允許刪除。

no action:意思同restrict.即如果存在從資料,不允許刪除主資料。

cascade(級聯):當在父表(即外來鍵的**表)中刪除對應記錄時,首先檢查該記錄是否有對應外來鍵,如果有則也刪除外來鍵在子表(即包含外來鍵的表)中的記錄。

set null:當在父表(即外來鍵的**表)中刪除對應記錄時,首先檢查該記錄是否有對應外來鍵,如果有則設定子表中該外鍵值為null(不過這就要求該外來鍵允許取null)

on update

restrict(約束):當在父表(即外來鍵的**表)中更新對應記錄時,首先檢查該記錄是否有對應外來鍵,如果有則不允許更新。

no action:意思同restrict.

cascade(級聯):當在父表(即外來鍵的**表)中更新對應記錄時,首先檢查該記錄是否有對應外來鍵,如果有則也更新外來鍵在子表(即包含外來鍵的表)中的記錄。

set null:當在父表(即外來鍵的**表)中更新對應記錄時,首先檢查該記錄是否有對應外來鍵,如果有則設定子表中該外鍵值為null(不過這就要求該外來鍵允許取null)。

注:no action和restrict的區別:只有在及個別的情況下會導致區別,前者是在其他約束的動作之後執行,後者具有最高的優先權執行。

cascade

在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄 

set null

在父表上update/delete記錄時,將子表上匹配記錄的列設為null (要注意子表的外來鍵列不能為not null)  

no action

如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作  

restrict

同no action, 都是立即檢查外來鍵約束

set null

父表有變更時,子表將外來鍵列設定成乙個預設的值 但innodb不能識別

null、restrict、no action

刪除:從表記錄不存在時,主表才可以刪除。刪除從表,主表不變

更新:從表記錄不存在時,主表才可以更新。更新從表,主表不變

restrict: 只要本**裡面有指向主表的資料, 在主表裡面就無法更新/刪除相關記錄,相當於no action。

cascade

刪除:刪除主表時自動刪除從表。刪除從表,主表不變

更新:更新主表時自動更新從表。更新從表,主表不變

set null

刪除:刪除主表時自動更新從表值為null。刪除從表,主表不變

更新:更新主表時自動更新從表值為null。更新從表,主表不變

外來鍵約束屬性: restrict | cascade | set null | no action  外來鍵的使用需要滿足下列的條件:

1. 兩張表必須都是innodb表,並且它們沒有臨時表。

2. 建立外來鍵關係的對應列必須具有相似的innodb內部資料型別。

3. 建立外來鍵關係的對應列必須建立了索引。

4. 假如顯式的給出了constraint symbol,那symbol在資料庫中必須是唯一的。假如沒有顯式的給出,innodb會自動的建立。

如果子表試圖建立乙個在父表中不存在的外鍵值,innodb會拒絕任何insert或update操作。如果父表試圖update或者delete任何子 表中存在或匹配的外鍵值,最終動作取決於外來鍵約束定義中的on update和on delete選項。innodb支援5種不同的動作,如果沒有指定on delete或者on update,預設的動作為restrict:

1. cascade: 從父表中刪除或更新對應的行,同時自動的刪除或更新自表中匹配的行。on delete canscade和on update canscade都被innodb所支援。

2. set null: 從父表中刪除或更新對應的行,同時將子表中的外來鍵列設為空。注意,這些在外鍵列沒有被設為not null時才有效。on delete set null和on update set set null都被innodb所支援。

3. no action: innodb拒絕刪除或者更新父表。

4. restrict: 拒絕刪除或者更新父表。指定restrict(或者no action)和忽略on delete或者on update選項的效果是一樣的。

5. set default: innodb目前不支援。

外來鍵約束使用最多的兩種情況無外乎:

1)父表更新時子表也更新,父表刪除時如果子表有匹配的項,刪除失敗;

2)父表更新時子表也更新,父表刪除時子表匹配的項也刪除。

前一種情況,在外鍵定義中,我們使用on update cascade on delete restrict;後一種情況,可以使用on update cascade on delete cascade。

oracle新增外來鍵約束

alter table gjjy.jy dic crop drop constraint fk zmlb alter table gjjy.jy dic crop drop constraint fk zwlb alter table gjjy.jy dic crop add constraint ...

Mysql新增外來鍵約束

最近學習遇到一條新增外來鍵約束的語句,記錄下來.alter table selection add constraint fk reference 1 foreign key course references course id on delete restrict on update restr...

新增主鍵約束跟外來鍵約束

表 一 student 學生表 新增主鍵約束學號sno 表 二 course 課程表 新增主鍵約束課程號con,新增外來鍵約束教工編號ton 表 三 score 成績表 新增兩個外來鍵約束學號sno和課程號cno,主鍵約束是sno cno。表 四 teacher 教師表 新增主鍵約束教工編號tno ...