'''但從約束層面上來說 相當於是 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...