MySQL約束條件之主鍵與外來鍵

2022-09-22 06:33:10 字數 4782 閱讀 8643

'''

但從約束層面上來說 相當於是 not null + unique(非空且唯一)

在此基礎之上還可以加快資料的查詢

innodb儲存引擎規定了一張表必須有且只有乙個主鍵

因為innodb是通過主鍵的方式來構造表的

如果沒有設定主鍵

情況1:沒有主鍵和其他約束條件

innodb會採用隱藏的字段作為主鍵 不能加快資料的查詢

情況2:沒有主鍵但是有非空且唯一的字段

自動將該字段公升級為主鍵

create table t6(

id int,

age int not null unique,

pwd int not null unique

);結論:  以後我們在建立表的時候一定要設定主鍵

並且主鍵字段一般都是表的id欄位(uid sid pid cid)

'''create

table

user

(  id

intprimary

key,

name

varchar(32

));

'''

由於主鍵類似於資料的唯一標識 並且主鍵一般都是數字型別

我們在新增資料的時候不可能記住接下來的序號是多少 太麻煩

'''create

table

user1(

id intprimary

keyauto_increment,

name

varchar(32));

'''自增的特性

自增不會因為刪除操作而回退

delete from無法影響自增

如果想要重置需需要使用truncate關鍵字

truncate 表名 # 清空表資料並且重置主鍵值

'''

建立一張員工表

id name age dep_name dep_desc

缺陷  

1.表的重點不清晰               可以忽略

到底是員工表還是部門表

2.表中相關字段一直在重複儲存         可以忽略

浪費儲存空間

3.表的擴充套件性極差,牽一髮而動全身    不能忽略

解決方式

將上述一張表拆分成兩張表

emp與dep

結論上述三個缺陷全部解決但帶來了乙個小問題 表與表之間的資料沒有對應關係了

外來鍵字段》:部門編號

其實就是用來標識表與表之間的資料關係

#簡單的理解為該字段可以讓你去到其他表中查詢資料

判斷表關係的方式:換位思考

1.一對多

以員工和部門表為例

先站在員工表的基礎之上

問:乙個員工資訊能否對應多個部門資訊

答:不可以

再站在部門表的基礎之上

問:乙個部門資訊能否對應多個員工資訊

答:可以

結論:乙個可以乙個不可以 那麼表關係就是"一對多"

員工表是多 部門表是一

針對一對多的表關係 外來鍵字段建在多的一方

# 表關係沒有'

多對一'一說 都是'

一對多'

'''使用sql語句建立真正意義上的表關係 可以先建立不含外來鍵字段的基本表

之後再新增外來鍵字段

'''create

table

dep(

id intprimary

keyauto_increment,

dep_name

varchar(32

),  dep_desc

varchar(254));

create

table

emp(

id intprimary

keyauto_increment,

name

varchar(32

),  age

int,

dep_id

int,

foreign

key(dep_id) references

dep(id)

);

2.多對多關係

以書籍表與作者表為例

先站在書籍表的基礎之上

問:乙個書籍資訊能否對應多個作者資訊

答:可以

再站在作者表的基礎之上

問:乙個作者資訊能否對應多個書籍資訊

答:可以

結論:兩個都可以 那麼表關係就是"多對多"

# 多對多表關係 需要單獨開設第三張表儲存(並且第三張表可以不繫結)

create

table

book(

id intprimary

keyauto_increment,

title

varchar(32

),  price

float(6,2));

create

table

author(

id intprimary

keyauto_increment,

name

varchar(32

),  age

int);

create

table

book2author(

id intprimary

keyauto_increment,

author_id

int,

book_id

int,

foreign

key(author_id) references

author(id)

onupdate

cascade

# 級聯更新

ondelete

cascade

, # 級聯刪除

foreign

key(book_id) references

book(id)

onupdate

cascade

# 級聯更新

ondelete

cascade

# 級聯刪除

);

3.一對一表關係

作者表與作者詳情表

先站在作者表的基礎之上

問:乙個作者資訊能否對應多個作者詳情資訊

答:不可以

再站在作者詳情表的基礎之上

問:乙個作者詳情資訊能否對應多個作者資訊

答:不可以

結論:兩個都不可以

那麼表關係可能是"一對一"或者"沒有關係"

# 外來鍵字段建在任何一方都可以 但是推薦建在查詢頻率較高的表中

create

table

author_detail(

id intprimary

keyauto_increment,

phone

varchar(32

),  address

varchar(32));

create

table

author(

id intprimary

keyauto_increment,

name

varchar(32

),  age

int,

author_id

intunique

,foreign

key(author_id) references

author_detail(id)

onupdate

cascade

# 級聯更新

ondelete

cascade

# 級聯刪除

);

1.在建立表的時候 需要先建立被關聯表(沒有外來鍵字段的表)

2.在插入新資料的時候 應該先確保被關聯表中有資料

3.在插入新資料的時候 外來鍵字段只能填寫被關聯表中已經存在的資料

4.在修改和刪除被關聯表中的資料的時候 無法直接操作

# 如果想要資料之間自動修改和刪除需要新增額外的配置

create

table

dep1(

id intprimary

keyauto_increment,

dep_name

varchar(32

),  dep_desc

varchar(254));

create

table

emp1(

id intprimary

keyauto_increment,

name

varchar(32

),  age

int,

dep_id

int,

foreign

key(dep_id) references

dep1(id)

onupdate

cascade

# 級聯更新

ondelete

cascade

# 級聯刪除

);'''

由於外來鍵有實質性的諸多約束 當表特別多的時候外來鍵的增多反而會增加耦合程度

所以在實際開發專案中 有時候並不會使用外來鍵建立表關係

而是通過sql語句層面 建立邏輯意義上的表關係

eg:操作員工表的sql執行完畢之後 立刻跟著執行操作部門的sql

'''

MySQL學習筆記 外來鍵約束條件

外來鍵有4種約束 1 restrict 立即檢查外來鍵約束 限制,如果子表引用了附表的某個字段,如外來鍵的引用,那麼就不允許直接刪除父表的該值。如果想要刪除,就得先刪除子表再刪除父表。2 cascade 級聯,update或者delete父表,子表中引用了該值所對應的記錄也會被自動同步update或...

mysql約束,主鍵,外來鍵

資料庫表約束 對錶中的資料進行限制,保證資料的正確性 有效性和完整性,乙個表如果新增了約束,不正確的資料將無法插入到表中。約束在建立表的時候新增比較合適。約束名約束關鍵字 主鍵primary key 唯一unique 非空not null 外來鍵foreign key 檢查約束 check 注 my...

mysql的主鍵 外來鍵約束 MySQL 主鍵外來鍵

笛卡兒積 多表查詢 多個表變成乙個表 完整性約束條件 primary key 標識該屬性為該錶的主鍵,可以唯一的標識對應的元組 foreign key 標識該屬性為該錶的外來鍵,是與之聯絡的某錶的主鍵 not null 標識該屬性不能為空 unique 標識該屬性的值是唯一的 auto increm...