MySql 中的約束
作用:
給表添加約束值,從而約束用戶操作數據庫的行為
數據庫常見的約束值如下:
- 默認值約束(default)
- 非空約束(not null)
- 唯一值約束(unique)
- 主鍵約束(primary key)
- 自增長約束(auto_increment)
- 外鍵約束(foreign key)
默認值約束
Notes: 當沒有插入數值的時候默認值才會起作用;
演示:
創建數據庫test:
建一個student表:
插入數據:
查詢顯示:
非空約束:
需求:當某個字段必須要值(不能不插入數值,也不能插入null),就給這個字段添加一個非空約束
刪除上面的student表,重新創建約束:
創建:
插入
可以看到,插入數值為null或者不插入都會提示錯誤!
唯一值約束(unique)
說明
id的值不能出現重復值。這時就要給id添加一個唯一約束。
刪除上面的student表:(同上不演示)
建表:
插入:
插入相同的id值報錯!
主鍵值約束(unique)
說明:
- 通常情況下,我們會給每張表都會設置一個主鍵字段,用來標記記錄的唯一性
- 但是不建議把業務含義字段作為主鍵,因為隨著業務的變化,業務字段可能會出現重復。
- 建議給每張張獨立添加一個叫id的字段,把這個id字段設置成主鍵,用來作為記錄的唯一性。
演示:
刪除上面的student表:(同上不演示)
建表:
插入:
這里插入重復值和不插入值都會報錯,說明非空+唯一約束生效!
自增長約束
說明
一個表中的id值通常都是一次+1的,這樣的需求其實不需要我們每次手動去插入數值,數據庫會自動幫我們插入數據,需要配合主鍵使用;
演示
刪除上面的student表:(同上不演示)
建表
插入
查詢
可以看到,我們并沒有給id插入數值,但查詢結果卻是依次增長的;
外鍵約束
場景描述:
外鍵約束: 約束兩種表的情況
問題:什么情況下會出現兩種表?
答案:員工表中出現部門名稱的冗余字段!!!!
如何解決部門名稱冗余問題?
答案:獨立設計一張部門表,把部門名稱放到部門表中,這是員工表只需要關聯部門的id即可!!
問題: 當插入員工表的部門id的時候,可能會出現不存在的部門id!!這是非法數據!!!如何防止非法數據的插入?
答案: 這是可以把員工表的部門id設置為外鍵約束。
當有了外鍵約束之后,操作數據的順序如下:
插入數據: 先插入主表的數據,再插入副表數據
修改數據: 先修改主表數據,再修改副表數據
刪除數據: 先刪除副表數據,再刪除主表數據
建表 hero
插入
show
通過上面的例子我們可以看到,梁山泊強盜集團我們插入了多次,數據庫存儲了多個這樣的值,這會造成數據庫空間的浪費。
怎么解決
可以再建一張表,用于專門存儲任務所屬的集團,這樣同樣的值就只會存入一次,具體怎么做?
先建立部門表
建立英雄表
插入
show
hero 插入
show hero
在通過聯表查詢就能知道對應id所屬集團的名字了!