數(shù)據(jù)完整性

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