外鍵約束
在本人之前的博文中,本人講解了數(shù)據(jù)庫中操作表的基本SQL語句,
那么,現(xiàn)在本人來講解下多表查詢的相關(guān)知識點。
首先,本人來講解下ER圖的相關(guān)知識點:
ER圖:
請觀看本人博文 —— 《【數(shù)據(jù)庫】ER圖》
一對多:
概念:
在開發(fā)中,關(guān)系中的一方稱之為主表 或者 一表,
關(guān)系中的多方稱之為多表或者從表
為了表示一對多的關(guān)系:
一般會在多表的一方添加一個字段,字段名稱自定義(建議:主表的名稱_id)
字段類型一般和主表的主鍵的類型保持一致,
我們稱這個字段為外鍵
添加外鍵的格式:
alter table 多表名稱 add foreign key(外鍵名稱) references 一表名稱(主鍵);
添加了外鍵約束之后有如下特點:
- 主表中不能刪除從表中已引用的數(shù)據(jù)
- 從表中不能添加主表中不存在的數(shù)據(jù)
那么,現(xiàn)在本人來通過一個例子展示下“一對多”的關(guān)系:
例1 —— 用戶和訂單:
本人現(xiàn)在來分析下這個例題:
分析:
在用戶與訂單的關(guān)系中,由于一個用戶擁有多個訂單,所以,用戶表是一表,訂單表是多表
那么,現(xiàn)在本人來展示下用戶表:
create table user(
id int primary key auto_increment,
username varchar(20)
);
接下來是訂單表:
create table orders(
id int primary key auto_increment,
totalprice double,
user_id int
);
接下來,我們給訂單表設(shè)置外鍵:
alter table orders add foreign key(user_id) references user(id);
若是我們想刪除主表中的數(shù)據(jù),則有兩種方法:
- 方式1: 級聯(lián)刪除(ON DELETE CASCADE)
即:在添加外鍵約束的語句最后面加上如下修飾符:
ON DELETE CASCADE
ALTER TABLE orders ADD FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE;
那么,現(xiàn)在本人來展示下生成的外鍵約束關(guān)系:
之后你就可以刪除主表中的數(shù)據(jù)了
當(dāng)然也可以將 級聯(lián)刪除 和 級聯(lián)更新 都加上:
ALTER TABLE orders ADD FOREIGN KEY (sid) REFERENCES stu(sid) ON DELETE CASCADE ON UPDATE CASCADE;
- 方式2:
先把帶有外鍵的多表的數(shù)據(jù)刪除,再刪除一表中的數(shù)據(jù)
多對多:
對于多對多現(xiàn)象,我們一般是這么處理的:
處理方式:
引入一張中間表,存放兩張表的主鍵,
一般會將這兩個字段設(shè)置為聯(lián)合主鍵,
這樣就可以將多對多的關(guān)系拆分
成兩個一對多關(guān)系了
為了保證數(shù)據(jù)的有效性和完整性
需要在中間表上添加兩個外鍵約束即可
那么,現(xiàn)在本人來通過一個例子展示下“一對多”的關(guān)系:
例1 —— 商品和訂單:
本人現(xiàn)在來分析下這個例題:
分析:
一種商品可以存在多個訂單中,一個訂單也包含多種商品,所以商品表和訂單表都是多表
那么,我們首先來創(chuàng)建商品表:
create table product(
id int primary key auto_increment,
name varchar(20),
price double
);
現(xiàn)在,本人再來創(chuàng)建訂單表:
create table orders(
id int primary key auto_increment,
totalprice double,
user_id int
);
現(xiàn)在,我們根據(jù)前兩張表,來制作中間表:
create table orderitem(
oid int,
pid int
);
添加外鍵約束:
alter table orderitem add foreign key(oid) references orders(id);
alter table orderitem add foreign key(pid) references product(id);
那么,本人來展示下生成的外鍵約束:
那么,本篇博文的知識點在這里就講解完畢了。
(請觀看本人博文 —— 《【數(shù)據(jù)庫】約束》)