第1章 多表操做學習
實際開發中,一個項目一般須要不少張表才能完成。例如:一個商城項目就須要分類表(category)、商品表(products)、訂單表(orders)等多張表。且這些表的數據之間存在必定的關係,接下來咱們將在單表的基礎上,一塊兒學習多表方面的知識。spa
1.1 表與表之間的關係
有3類表關係:一對多(多對一)、多對多、一對一(瞭解)
一對多關係:
常見實例:學生和考試成績(畫圖),客戶和訂單,分類和商品,部門和員工.
一對多建表原則:在從表(多方)建立一個字段,字段做爲外鍵指向主表(一方)的主鍵.code
多對多關係:
常見實例:學生和教師,商品和訂單(畫圖),學生和課程、用戶和角色
多對多關係建表原則:須要建立第三張表,中間表中至少兩個字段,這兩個字段分別做爲外鍵指向各自一方的主鍵.ci
一對一關係:(瞭解)
在實際的開發中應用很少,好比QQ號碼,和QQ用戶信息
由於一對一能夠建立成一張表.
兩種建表原則:
外鍵惟一:主表的主鍵和從表的外鍵(惟一),造成主外鍵關係,外鍵惟一unique。
外鍵是主鍵:主表的主鍵和從表的主鍵,造成主外鍵關係。開發
1.2 外鍵約束it
如今咱們有兩張表「分類表」和「商品表」,爲了代表商品屬於哪一個分類,一般狀況下,咱們將在商品表上添加一列,用於存放分類cid的信息,此列稱爲:外鍵table
此時「分類表category」稱爲:主表,「cid」咱們稱爲主鍵。「商品表products」稱爲:從表,category_id稱爲外鍵。咱們經過主表的主鍵和從表的外鍵來描述主外鍵關係,呈現就是一對多關係。 外鍵特色:
從表外鍵的值是對主表主鍵的引用。
從表外鍵類型,必須與主表主鍵類型一致。基礎
聲明外鍵約束
語法:alter table 從表 add [constraint] [外鍵名稱] foreign key (從表外鍵字段名) references 主表 (主表的主鍵);
[外鍵名稱] 用於刪除外鍵約束的,通常建議「_fk」結尾
alter table 從表 drop foreign key 外鍵名稱
使用外鍵目的:
保證數據完整性語法
1.3 一對多操做
1.3.1 分析引用
category分類表,爲一方,也就是主表,必須提供主鍵cid
products商品表,爲多方,也就是從表,必須提供外鍵category_id
1.3.2 實現:分類和商品
create table category(
cid int(32) PRIMARY KEY ,
cname varchar(100) #分類名稱
);
CREATE TABLE products (
pid int PRIMARY KEY ,
pname VARCHAR(40) ,
price DOUBLE ,
category_id int
);
alter table products add constraint product_fk foreign key (category_id) references category (cid);
1.3.3 操做
INSERT INTO category (cid ,cname) VALUES(1,'服裝');
INSERT INTO products (pid,pname) VALUES(1,'商品名稱');
INSERT INTO products (pid ,pname ,category_id) VALUES(2,'商品名稱2', 1);
INSERT INTO products (pid ,pname ,category_id) VALUES(3,'商品名稱2',9);
DELETE FROM category WHERE cid = 1;
1.4 多對多
1.4.1 分析
商品和訂單多對多關係,將拆分紅兩個一對多。
products商品表,爲其中一個一對多的主表,須要提供主鍵pid
orders 訂單表,爲另外一個一對多的主表,須要提供主鍵oid
orderitem中間表,爲另外添加的第三張表,須要提供兩個外鍵oid和pid
1.4.2 實現:訂單和商品
create table orders(
oid int PRIMARY KEY ,
totalprice double #總計
);
create table orderitem(
oid int,-- 訂單id
pid int(50)-- 商品id
);
alter table orderitem add constraint orderitem_orders_fk foreign key (oid) references orders(oid);
alter table orderitem add constraint orderitem_product_fk foreign key (pid) references products(pid);
1.4.3 操做
INSERT INTO products (pid,pname) VALUES(3,'商品名稱');
INSERT INTO orders (oid ,totalprice) VALUES(1,998);
INSERT INTO orders (oid ,totalprice) VALUES(2,100);
INSERT INTO orderitem(pid,oid) VALUES(1, 1);
INSERT INTO orderitem(pid,oid) VALUES(1, 2);
INSERT INTO orderitem(pid,oid) VALUES(2,2);
DELETE FROM orderitem WHERE pid=2 AND oid = 2;
INSERT INTO orderitem(pid,oid) VALUES(2, 3);
DELETE FROM products WHERE pid = 1;