數據庫篇多表操做

第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 操做

1 向分類表中添加數據

INSERT INTO category (cid ,cname) VALUES(1,'服裝');

2 向商品表添加普通數據,沒有外鍵數據,默認爲null

INSERT INTO products (pid,pname) VALUES(1,'商品名稱');

3 向商品表添加普通數據,含有外鍵信息(數據存放在)

INSERT INTO products (pid ,pname ,category_id) VALUES(2,'商品名稱2', 1);

4 向商品表添加普通數據,含有外鍵信息(數據不存在) -- 不能異常

INSERT INTO products (pid ,pname ,category_id) VALUES(3,'商品名稱2',9);

5 刪除指定分類(分類被商品使用) -- 執行異常

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 操做

1 向商品表中添加數據

INSERT INTO products (pid,pname) VALUES(3,'商品名稱');

2 向訂單表中添加數據

INSERT INTO orders (oid ,totalprice) VALUES(1,998);
INSERT INTO orders (oid ,totalprice) VALUES(2,100);

3向中間表添加數據(數據存在)

INSERT INTO orderitem(pid,oid) VALUES(1, 1);
INSERT INTO orderitem(pid,oid) VALUES(1, 2);
INSERT INTO orderitem(pid,oid) VALUES(2,2);

4刪除中間表的數據

DELETE FROM orderitem WHERE pid=2 AND oid = 2;

5向中間表添加數據(數據不存在) -- 執行異常

INSERT INTO orderitem(pid,oid) VALUES(2, 3);

6刪除商品表的數據 -- 執行異常

DELETE FROM products WHERE pid = 1;

相關文章
相關標籤/搜索