1. 是否允許為空(Null/not Null) 規定一個欄位的值是否可以是null。預設是可以為空。 此時,插入值a = 10 , b 為空,發現可以正確插入: 若試圖插入值b = 11,而a 不做處理,發現不能正確插入,提示 a 沒有預設值。 即當對某個欄位未輸入信息時,列屬性趨向於先查找有無默 ...
1. 是否允許為空(Null/not Null)
規定一個欄位的值是否可以是null。預設是可以為空。
此時,插入值a = 10 , b 為空,發現可以正確插入:
若試圖插入值b = 11,而a 不做處理,發現不能正確插入,提示 a 沒有預設值。
即當對某個欄位未輸入信息時,列屬性趨向於先查找有無預設值。
tip: NULL與空字元串不同,Null會占用空間,需要表示某些欄位可以為NULL。
2. 設置預設值(default value)
當插入數據中,有空欄位時,會嘗試查找該欄位有沒有設置預設值。
若提前設置了預設值,則會使用預設值。如下圖:
當只插入a = 11時,b 由於不允許為NULL,查找預設值,並設置b = 20.
結果如下圖:
只插入b = 11,也是同樣的道理。
tip: 若給某欄位插入的值為NULL,則顯示會是NULL,而不會選擇預設值;
當且僅當沒有給該欄位插入值,並且有預設值時,才會啟用預設值。
預設值常用的情況是:該欄位不能為空,會設置預設值。
3. 主鍵|唯一索引
主鍵(PK : primary key):在創建表時,可以唯一標識某條記錄的欄位或欄位集合。
可以是真實實體的屬性,如身份證號,但常用解決方案是利用一個與實體信息不相關的屬性,作為唯一標識
主鍵不與業務邏輯發生關係,只用來標識記錄。
ID | 班級 | 姓名 | 年齡 |
1 | 1520113 | 張三 | 24 |
2 | 1520114 | 李四 | 26 |
對於上表,姓名和年齡可能會出現重覆,不能作為主鍵;
若沒有ID,而其他個欄位單獨都可能出現重覆,可以考慮組合其中某幾個欄位(如班級+姓名),實現唯一標識。
主鍵的設置方法:
方案一:欄位上設置
此時,若試圖再次插入一個t_id為1的數據時,會提示錯誤,主鍵不能重覆。
另外,主鍵t_id也不可以設置為NULL,雖然並未設置NOT NULL。
但是若類型允許,可以為負值,只要滿足唯一標識原則。
查詢表,會發現t_id已被設為主鍵。
方案二:在建表的最後聲明
1 create table teacher1( 2 t_id int, 3 t_name varchar(5), 4 class_name varchar(6), 5 days tinyint unsigned, 6 primary key (t_id) //在定義的末章節附註明主鍵是上述的哪個欄位 7 );
方案二的優勢:可以標註多個欄位作為組合主鍵。
tip: 註意說法上的嚴謹:現在是一個主鍵上包含了兩個欄位,而不能說這兩個欄位都是主鍵,可以說這兩個欄位組成了主鍵。
tip: 自動增長機制(為每條記錄提供一個唯一的標識)
每次插入記錄時,將某個欄位的值自動加一。
使用auto_increment標識,如下圖所示
對於設置了auto_increment的主鍵而言,當輸入數據時,若把該欄位的值設為NULL,或者不輸入該欄位內容。
系統都會以自動增加的形式,為數據編號,如下圖:
tip: 其實不是主鍵的欄位,也可以設置為auto_increment。
另外,自動增長的初始值是可以設置的,預設是1.
通過alter 語句進行更改,如下圖:
此時再插入數據,不設置主鍵的值,會發現結果如下:
tip:當設置的N的值,小於當前主鍵的值時,則可以設置成功,但是實際仍然會基於現有的主鍵值進行自動增長。
question: 設置了auto_increment後,是否還可以手動插入主鍵的值?YES!!只要不發生衝突。
能否更新當前的數據?YES,利用update語句。
4. 外鍵約束(foreign key)
若一個實體的某個欄位指向另一個實體的主鍵,eg. student表的欄位class_id指向class表的主鍵class_id。
就成當前student實體的class_id是外鍵。
被指向的實體,稱為主實體,也叫父實體。class
負責指向的實體,稱為從實體,也叫子實體。student
作用:用於約束處於關係內的實體。
① 增加子表記錄時,是否有與之對應的父表記錄;
② 刪除or更新父表記錄時,子表應該如何處理相關的記錄;
定義:在子表上增加外鍵欄位,指向父表的主鍵。
建立it_class表,設置欄位class_id為主鍵:
建立itcast_student表,定義欄位class_id,並設置它為外鍵,指向it_class表中的主鍵欄位class_id。
語句為 foreign key (欄位名) references 父表名 (父表主鍵);
若要在itcast_student表中,插入數據,但該學生所指的班級不存在,會導致創建不成功:
可以在父表it_class中插入數據,即使子表中沒有指向其主鍵的數據:
級聯操作:當主表數據改變時,與之關聯的從表數據應該如何處理。
① 主表更新:on update
② 主表刪除:on delete
允許的級聯動作:
① cascade:如果主表被更新or刪除,則從表也會執行相應的操作。
② set null:若主表記錄被刪除,則從表相應記錄設置為null。表示從表不指向任何主表記錄。
③ restrict:拒絕主表的相關操作。
修改外鍵:
先刪除,再新建,通過修改表來完成。
alter table tb_name drop foreign key (class_id);
刪除外鍵需要通過指定外鍵名稱來達到目的,可以通過在創建外鍵時,指定名稱,也可以使用MySQL預設生成的名稱。
新建外鍵,指定允許的級聯動作為set null:
此時若刪除父表it_class中編號為1的記錄時,會發現與之關聯的從表itcast_student中相應的記錄處,變成了NULL:
on update 指的是只有主表的主鍵發生變化,才會對從表發生影響。