1. 程式人生 > >今日刷題總結10

今日刷題總結10

多列 參照完整性 回滾 delet sna where ima tab set

外鍵約束

外鍵 (FK) 是用於在兩個表中的數據之間建立和加強鏈接的一列或多列的組合,可控制在外鍵表中存儲的數據。 在外鍵引用中,當包含一個表的主鍵值的一個或多個列被另一個表中的一個或多個列引用時,就在這兩個表之間創建了鏈接。 這個列就成為第二個表的外鍵。比如表A中的主鍵是表B中的字段,則該字段就是表B的外鍵,表A是主表,表B是從表。以MySQL為例,總結一下3種外鍵約束方式的區別和聯系。

假設有學生表student(sid,sname,did)以及院系表depart(did,dname)。sid為student的主鍵,did為depart的主鍵且為student的外鍵。創建depart表的sql語句如下:

create table depart(

did int not null,

dname varchar(50),

primary key(did)

)

然後插入三條記錄(1,“計算機學院”),(2,“經貿學院”)。

insert into depart(1,"計算機學院");

insert into depart(2,"經貿學院");

分別以不同的約束方式創建外鍵引用關系:

(1)NO ACTION:數據庫引擎將引發錯誤,此時將回滾對主表中行的刪除或更新操作。

create table student(

sid int not null,

sname varchar(30),

primary key(sid),

foreign key(did) references depart(did) on delete no action on update no action

)

插入3條記錄(1,“張三”,1),(2,“李四”,2),(3,“王五”,3)。

insert into student(1,"張三",1);#插入成功

insert into student(2,"李四",2);#插入成功

insert into student(3,"王五",3);#無法插入,院系號3不存在,與參照完整性約束不符

delete from depart where did=1;#從表student中有相關引用,因此主表中無法刪除

update depart set did=2 where did=1;#從表中有相關引用,因此主表中無法修改

(2)CASCADE:如果在主表中更新或刪除了一行,則將在從表中更新或刪除相應的行。

create table student(

sid int not null,

sname varchar(30),

primary key(sid),

foreign key(did) references depart(did) on delete cascade on update cascade

)

插入3條記錄(1,“張三”,1),(2,“李四”,2),(3,“王五”,3)。

insert into student(1,"張三",1);#插入成功

insert into student(2,"李四",2);#插入成功

insert into student(3,"王五",3);#無法插入,院系號3不存在,與參照完整性約束不符

delete from depart where did=2;#student中第2條記錄級聯刪除

update depart set did=2 where did=1;#student中第一條記錄的did級聯修改為2

(3)SET NULL:如果更新或刪除了主表中的相應行,則會將構成外鍵的所有值設置為 NULL。

create table student(

sid int not null,

sname varchar(30),

primary key(sid),

foreign key(did) references depart(did) on delete set null on update set null

)

插入3條記錄(1,“張三”,1),(2,“李四”,2),(3,“王五”,3)。

insert into student(1,"張三",1);#插入成功

insert into student(2,"李四",2);#插入成功

insert into student(3,"王五",3);#無法插入,院系號3不存在,與參照完整性約束不符

delete from depart where did=1;#student中第1條記錄的did設置為NULL

update depart set did=1 where did=2;#student中第2條記錄的did設置為NULL

今日刷題總結10