數據庫_mysql多表操作


多表操作

       實際開發中,一個項目通常需要很多張表才能完成。例如:一個商城項目就需要分類表(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';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM