【數(shù)據(jù)庫】外鍵約束

外鍵約束

在本人之前的博文中,本人講解了數(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 一表名稱(主鍵);

添加了外鍵約束之后有如下特點:

  1. 主表中不能刪除從表中已引用的數(shù)據(jù)
  2. 從表中不能添加主表中不存在的數(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ù)庫】約束》)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一、什么是主鍵、外鍵: 關(guān)系型數(shù)據(jù)庫中的一條記錄中有若干個屬性,若其中某一個屬性組(注意是組)能唯一標(biāo)識一條記錄,...
    孤鳴雁閱讀 1,412評論 0 2
  • 目錄 1、主鍵、外鍵、索引定義 2、為什么定義主鍵、外鍵 3、主鍵和外鍵的關(guān)系 4、數(shù)據(jù)庫中主鍵和外鍵的設(shè)計原則 ...
    greensure閱讀 1,838評論 1 4
  • 數(shù)據(jù)表是數(shù)據(jù)庫中最重要、最基本的操作對象,是數(shù)據(jù)存儲的基本單位。數(shù)據(jù)表被定義為列的集合,數(shù)據(jù)在表中是按照行和列的格...
    假正經(jīng)乄閱讀 1,935評論 0 2
  • 1、約束概述 約束的目的是為了保證數(shù)據(jù)的完整性與一致性。 按照約束的范圍劃分:列級約束:只對一個數(shù)據(jù)列建立約束。既...
    黒貓閱讀 997評論 3 5
  • 假期結(jié)束了,今天是開學(xué)第一天。早上送兒子上學(xué)路上,看見了一起交通事故,兩個小轎車因為超車撞到一起,車上人員受了傷,...
    本仙老四閱讀 87評論 0 3