多表操作
實際開發中,一個項目通常需要很多張表才能完成。例如:一個商城項目就需要分類表(category)、商品表(products)、訂單表(orders)等多張表。且這些表的數據之間存在一定的關系。
1.1 表與表之間的關系
l 一對多關系:
n 常見實例:客戶和訂單,分類和商品,部門和員工.
n 一對多建表原則:在從表(多方)創建一個字段,字段作為外鍵指向主表(一方)的主鍵.
l 多對多關系:
n 常見實例:學生和課程、用戶和角色
n 多對多關系建表原則:需要創建第三張表,中間表中至少兩個字段,這兩個字段分別作為外鍵指向各自一方的主鍵.
l 一對一關系:(了解)
n 在實際的開發中應用不多.因為一對一可以創建成一張表.
n 兩種建表原則:
u 外鍵唯一:主表的主鍵和從表的外鍵(唯一),形成主外鍵關系,外鍵唯一unique。
u 外鍵是主鍵:主表的主鍵和從表的主鍵,形成主外鍵關系。
1.2 外鍵約束
現在我們有兩張表“分類表”和“商品表”,為了表明商品屬於哪個分類,通常情況下,我們將在商品表上添加一列,用於存放分類cid的信息,此列稱為:外鍵
此時“分類表category”稱為:主表,“cid”我們稱為主鍵。“商品表products”稱為:從表,category_id稱為外鍵。我們通過主表的主鍵和從表的外鍵來描述主外鍵關系,呈現就是一對多關系。
外鍵特點:
u 從表外鍵的值是對主表主鍵的引用。
u 從表外鍵類型,必須與主表主鍵類型一致。
l 聲明外鍵約束
語法:alter table 從表 add [constraint] [外鍵名稱] foreign key (從表外鍵字段名) references 主表 (主表的主鍵);
[外鍵名稱]用於刪除外鍵約束的,一般建議“_fk”結尾
altertable 從表 drop foreignkey 外鍵名稱
l 使用外鍵目的:
n 保證數據完整性
1.3 一對多操作
1.3.1 分析
-
category分類表,為一方,也就是主表,必須提供主鍵cid
-
products商品表,為多方,也就是從表,必須提供外鍵category_id
-
1.3.2 實現:分類和商品
###創建分類表
create table category(
cidvarchar(32) PRIMARY KEY ,
cnamevarchar(100) #分類名稱
);
# 商品表
CREATE TABLE `products` (
`pid`varchar(32) PRIMARY KEY ,
`name`VARCHAR(40) ,
`price`DOUBLE
);
#添加外鍵字段
alter table products add column category_id varchar(32);
#添加約束
alter table products add constraint product_fkforeign key (category_id) references category (cid);
1.3.3 操作
#1 向分類表中添加數據
INSERT INTO category (cid ,cname) VALUES('c001','服裝');
#2 向商品表添加普通數據,沒有外鍵數據,默認為null
INSERT INTO products (pid,pname) VALUES('p001','商品名稱');
#3 向商品表添加普通數據,含有外鍵信息(數據存放在)
INSERT INTO products (pid ,pname ,category_id)VALUES('p002','商品名稱2','c001');
#4 向商品表添加普通數據,含有外鍵信息(數據不存在) -- 不能異常
INSERT INTO products (pid ,pname ,category_id)VALUES('p003','商品名稱2','c999');
#5 刪除指定分類(分類被商品使用) -- 執行異常
DELETE FROM category WHERE cid = 'c001';
1.4 多對多
1.4.1 分析
-
商品和訂單多對多關系,將拆分成兩個一對多。
-
products商品表,為其中一個一對多的主表,需要提供主鍵pid
-
orders 訂單表,為另一個一對多的主表,需要提供主鍵oid
-
orderitem中間表,為另外添加的第三張表,需要提供兩個外鍵oid和pid
1.4.2 實現:訂單和商品
### 商品表[已存在]
### 訂單表
create table `orders`(
`oid`varchar(32) PRIMARY KEY ,
`totalprice` double #總計
);
### 訂單項表
create table orderitem(
oidvarchar(50),-- 訂單id
pidvarchar(50)-- 商品id
);
###---- 訂單表和訂單項表的主外鍵關系
alter table `orderitem` add constraintorderitem_orders_fk foreign key (oid) references orders(oid);
###---- 商品表和訂單項表的主外鍵關系
alter table `orderitem` add constraintorderitem_product_fk foreign key (pid) references products(pid);
### 聯合主鍵(可省略)
alter table `orderitem` add primary key (oid,pid);
1.4.3 操作
#1 向商品表中添加數據
INSERT INTO products (pid,pname) VALUES('p003','商品名稱');
#2 向訂單表中添加數據
INSERT INTO orders (oid ,totalprice)VALUES('x001','998');
INSERT INTO orders (oid ,totalprice)VALUES('x002','100');
#3向中間表添加數據(數據存在)
INSERT INTO orderitem(pid,oid)VALUES('p001','x001');
INSERT INTO orderitem(pid,oid)VALUES('p001','x002');
INSERT INTO orderitem(pid,oid)VALUES('p002','x002');
#4刪除中間表的數據
DELETE FROM orderitem WHERE pid='p002' AND oid ='x002';
#5向中間表添加數據(數據不存在) -- 執行異常
INSERT INTO orderitem(pid,oid)VALUES('p002','x003');
#6刪除商品表的數據 -- 執行異常
DELETE FROM products WHERE pid = 'p001';
-