文章目錄
- 一、空屬性
- 二、默認值
- 三、zerofill
- 四、列描述
- 五、主鍵
- 刪除主鍵
- 追加主鍵
- 復合主鍵
- 根據主鍵快速索引
- 六、自增長
- last_insert_id()
- 七、唯一鍵
- 八、外鍵
- class表(主表)
- student表(從表)
一、空屬性
之前我們將表的機構,使用desc table_name查看表的結構的時候,我們并沒有說明Null這一欄代表的什么意思,現在我們就來詳細講解一下。
試想一種場景,我們要統計一個班上的人員信息,我們就需要創建一個表,這個表需要保存學生的姓名,學號,地址等信息。 以實際需求來講,我們在插入表的時候,這里的姓名和學號是一定不能為空的,所以為了約束程序員在對表插入信息的行為,就可以使用添加是否允許一個字段的數據可以被設置為NULL。
那么怎么才能約束這種空屬性的行為呢?
我們只需要在創建表的時候對字段添加上 not null
就可以約束該字段不允許為NULL。
可以看到,對設置的not null的字段強行設置為null時,數據庫是會給我們報錯的!
所以可以通過設置null空屬性來對我們表插入的一種約束!
二、默認值
直接教用法:
然后插入數據
可以看到,我們設置的字段如果帶有default默認值,在插入時如果忽略這個字段,會默認根據我們的設置的default默認值來填充這個字段。
三、zerofill
剛開始學習數據庫時,很多人對數字類型后面的長度很迷茫。
mysql> show create table tt3\G
***************** 1. row *****************
Table: tt3
Create Table: CREATE TABLE tt3 (
a int(10)
unsigned DEFAULT NULL,
b int(10)
unsigned DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
int(N)
中的(N)
如果沒有攜帶zerofill就沒有意義了,那么它的作用是什么呢?
- 一旦添加了zerofill,該數字類型就會變成unsigned,所以也就不能再設置為負數。
- 我們使用select查詢表中的內容時,可以發現,如果你輸入的數字少于N位,輸出的時候就會用0來填補位數;如果你輸入的位數大于N位,就不會有任何影響。
四、列描述
列描述–comment之前我們就已經接觸過了。
comment更像是一種注釋的行為,也算是一種約束。
五、主鍵
主鍵:primary key用來唯一的約束該字段里面的數據,不能重復,不能為空,一張表中最多只能有一個主鍵。 主鍵所在的列通常是整數類型。
例如下面我們要創建一個student表,要以學生的學號作為主鍵。
方法1
方法2
在插入的時候,作為主鍵的字段不允許插入重復的數據,否則會報錯。
刪除主鍵
當創建好了一個表,并且創建表的時候就設置好了主鍵,如果又想刪除這個字段的主鍵性質,應該怎么辦?
追加主鍵
當有一個表,這個表沒有主鍵,現在想讓一個字段追加主鍵性質,應該怎么辦?
復合主鍵
上面不是說 一張表中最多只能有一個主鍵嗎? 為什么這里有兩個主鍵?
這里的主鍵其實也只是一個,只不過這個表的主鍵添加到了兩列上。
復合主鍵所帶來的就是 在插入數據的時候,只要被設為主鍵的字段不同時存在相同的數據,就不會報錯。
這里就是只要id和phone_num不同時都重復,插入就不會有問題,只有一個重復是沒有關系的。
根據主鍵快速索引
六、自增長
auto_increment:當對應的字段,不給值,會自動的被系統觸發,系統會從當前字段中已經有的最大值+1操作,得到一個新的不同的值。通常和主鍵搭配使用,作為邏輯主鍵。
- 任何一個字段要做自增長,前提是本身是一個索引(key一欄有值)
- 自增長字段必須是整數
- 一張表最多只能有一個自增長
我們再調用show create table student \G;
可以看到這里是有一個AUTO_INCREMENT=22來控制這種自增長的。
last_insert_id()
LAST_INSERT_ID() 是 MySQL 中的一個函數,它用于獲取最近一次使用 AUTO_INCREMENT 字段的 INSERT 或 UPDATE 語句生成的 ID 值。這個函數非常有用,特別是在你插入數據到包含自增主鍵的表中,并希望立即獲取這個新生成的主鍵值的時候。
七、唯一鍵
一張表中有往往有很多字段需要唯一性,數據不能重復,但是一張表中只能有一個主鍵。 唯一鍵就可以解決表中有多個字段需要唯一性約束的問題。
那么唯一鍵跟主鍵有什么區別呢?
主鍵更多的是標識唯一性的。而唯一鍵更多的是保證在業務上,不要和別的信息出現重復。(其實也就是哲學意義不同)
對一個字段設置唯一鍵屬性,可以用unique也可以用unique key。
我們還可以看到,primary key是默認帶有not null屬性的,unique key是不默認帶有not null屬性的。
八、外鍵
外鍵用于定義主表和從表之間的關系:外鍵約束主要定義在從表上,主表則必須是有主鍵約束或unique約束。當定義外鍵后,要求外鍵列數據必須在主表的主鍵列存在或為null。
這里我們舉一個例子就是主表為class,它有班級編號和班級名稱;從表為student,它有學生的所屬班級和學生的個人信息。 這里我們就可以讓student表的所屬班級與class表的班級編號相關聯。
class表(主表)
student表(從表)
當從表student在向class_id插入1,2,3時都是非常順利地插入進去的,但是當插入4的時候就報錯了,這是因為我們的主表class只有1,2,3三個class_id,沒有4這個班級編號,所以當從表student在插入4時才會報錯,這就說明了這兩個表已經建立了約束關系。
那如果我的主表想刪除一行怎么辦?
可以看到,如果我們想要刪除主表中class_id=1的一行數據,數據庫是不讓我刪的,這是因為我們的從表student也已經有對應的外鍵class_id=1,如果想要主表刪除class_id=1這一數據行,首先就要刪除所有從表外鍵class_id=1的數據行。
這也說明 主表和從表因為外鍵是互相約束的。