數(shù)據(jù)完整性
08數(shù)據(jù)完整性.png
域完整性和實(shí)體完整性在之前的內(nèi)容中都已經(jīng)涵蓋了,自定義完整性為了解內(nèi)容。下面重點(diǎn)說明一下引用完整性,外鍵。
引用完整性
如果有兩個(gè)表,都有主鍵,且兩者的主鍵是公共字段,從表的主鍵是主表的外鍵。只有innodb引擎能創(chuàng)建外鍵,myisam等引擎不支持外鍵
- 外鍵約束的特點(diǎn)
- 主表中沒有的,從表中不允許插入。
- 從表中有的,主表不允許刪除。
- 不能改主表中的值,而導(dǎo)致從表孤立存在。
- 先刪從表,才能刪主表。
- 外鍵(foreign key)
- 外鍵是從表中的公共字段,公共字段名字可以不一樣,但是數(shù)據(jù)類型必須一樣。
- 外鍵約束用來保證引用完整性。
-
外鍵的創(chuàng)建,添加和刪除
- 建表時(shí)添加外鍵:使用語句
foreign key (從表要添加外鍵的字段名) references 主表名(主表字段名)
。 - 修改表時(shí)添加外鍵:
altre table 從表表名 add foreign key (從表字段名) references 主表名 (主表字段名);
- 通過外鍵名(使用查詢創(chuàng)建表的語句查看外鍵名)刪除外鍵:
alter table 從表表名 drop foreign key 外鍵名;
。
- 建表時(shí)添加外鍵:使用語句
/*
創(chuàng)建外鍵
*/
# 創(chuàng)建主表,學(xué)生信息(student inforence)表
create table stuinf(
id int,
stuid char(11) not null primary key, # 必須是主鍵
name varchar(10)
);
# 創(chuàng)建從表,學(xué)生分?jǐn)?shù)(student score)表
create table stusco(
stuid char(11) not null,
score decimal(4,1),
foreign key (stuid) references stuinf(stuid) #添加外鍵,通過兩個(gè)表的stuid建立聯(lián)系
);
/*
添加外鍵
*/
# 創(chuàng)建主表,學(xué)生信息(student inforence)表
create table stuinf(
id int,
stuid char(11) not null primary key,
name varchar(10)
);
# 創(chuàng)建從表,學(xué)生分?jǐn)?shù)(student score)表
create table stusco(
stuid char(11) not null,
score decimal(4,1),
);
# 添加外鍵
alter table stusco add foreign key(stuid) reference stuinf(stuid);
/*
刪除外鍵
*/
alter table stusco drop foreign key 外鍵名;
外鍵操作(了解)
- 嚴(yán)格操作,以上講的都是嚴(yán)格操作。
- 置空操作(set null);如果主表記錄刪除或更新,從表置空。
- 級(jí)聯(lián)操作(cascade);如果主表記錄刪除或更新,從表級(jí)聯(lián)。
一般來說,主表某數(shù)據(jù)刪除時(shí),從表對(duì)應(yīng)數(shù)據(jù)置空;主表數(shù)據(jù)更新時(shí),從表對(duì)應(yīng)數(shù)據(jù)級(jí)聯(lián)。
# 語法
foreign key (外鍵) references 主表(關(guān)鍵字段) [主表刪除時(shí)的動(dòng)作] [主表數(shù)據(jù)更新時(shí)的動(dòng)作];
例子:
# 創(chuàng)建主表
create table stuinf(
stuno char(4) primary key,
name varchar(10) not null
);
# 從表
create table stusco(
stuid char(4), # 不能做主鍵,否則無法置空
score tinyint unsigned,
foreign key (stuid) references stuinf(stuno) on delete ste null on update cascade
);
這樣,如果你改動(dòng)了主表中的某些數(shù)據(jù),從表也會(huì)發(fā)生相應(yīng)的改變。
保證實(shí)體完整性
- 主鍵約束
- 唯一約束
- 自動(dòng)增長
保證域完整性
- 數(shù)據(jù)類型約束
- 非空類型約束
- 默認(rèn)值約束
保證引用完整性
- 外鍵約束,從表中的公共字段是主表中的外鍵。
保證自定義完整性
- 存儲(chǔ)過程
- 觸發(fā)器