2外鍵約束
1>外鍵簡介
外鍵記錄了表與表之間字段的聯系。外鍵將不同表的字段關聯起來,使這些數據在修改、刪除時有著關聯,在數據操作時維護這些數據完整性。
外鍵有兩個作用:
2>外鍵的使用
語法:
alter table table_name add [constraint 外鍵名] foreign key [id] (index_cil_name, …) references table_name (index_col_name, …)
[on delete {cascade " set null | no action | restrict}]
[on update {cascade | set null | no action | restrict}]
可以看到mysql對創建外鍵要求嚴格,精確到字段的類型和長度。
對於外鍵最好采用 on delete restrict 和on update cascade的方式。
cascade:外鍵表中外鍵字段值會跟隨父表被跟新,或所在的列會被刪除。
no action:不進行任何關聯操作
restrict:restrict相當於no action,即不進行任何操作。拒絕父表修改外鍵關聯列,刪除記錄。
set null:在父表的外鍵關聯字段被修改和刪除時,外建表的外鍵列被設置為空(null)。
對於數據的添加,子表的外鍵列輸入的值,只能是父表外鍵關聯列已有的值,否則出錯。
現有剛剛創建的表student和book。把book中typeid字段對應student表中的sid字段:
通過show create table table_name 可以創建表的代碼以及存儲引擎,同時可以看到外鍵的設置。
刪除外鍵:
alter table table_name drop foreign key 外鍵名;
一張表的外鍵可能不止一個,刪除多個外鍵可以重復使用上述語句。
注:定義外鍵時,使用“constraint 外鍵名 foreign key …”語句,能夠很方便的通過外鍵名來刪除外鍵。
3. 非空約束
被設置了非空約束的字段,在添加數據的時候必須要有數據。非空約束限制字段中的內容不能為空,但可以是空串或0。
在創建表的時候直接在字段類型後邊添加 not null 或null,即可設置為字段非空或者空。
把已有的表某個字段設置為非空:
alter table table_name modify 字段名 字段類型 not null;
4. 默認值
默認值是為字段指定默認的數據值。默認值的使用減輕了數據添加的負擔,默認值除了可以定義為指定值,還可以設置為當前時間。被設置默認值的字段最好不為空,否則系統將無法確定該字段在添加時添加null還是默認值。
添加默認值:
在創建表的時候直接字段類型後邊添加 “default 默認數據”,對於已有的表使用set關鍵字:
alter table table_name alter 字段名 set default 默認值數據;
刪除已有的默認值:
alter table table_name alter 字段名 drop default;
修改默認值:可先執行刪除語句在執行添加默認值語句。
上述sql語句先給typeid添加默認值2,再修改為5.
5. 唯一性約束
唯一性約束(unique constraint)要求添加該約束的列字段的值唯一,允許為空,但只能出現一個空值。唯一約束可以確保一列或多列不出現重復值。
創建唯一約束字段:
在建表時,可以直接創建唯一約束,可以直接在字段的數據類型後邊直接添加unique關鍵字,也可以在所有字段定義之後使用[constraint <約束名>] unique(<字段名>)
對於已經存在的表和字段,添加唯一約束要使用add關鍵字:
alter table table_name add unique(字段列表);
刪除唯一約束:
alter table table_name modify column 字段名 字段類型 [字段約束];
6. 自增約束
自增約束是一種由系統自動增加並填入字段數值的約束。
auto_increment是數據列的一種屬性,只適用於整數類型數據列,
auto_increment數據列必須有唯一約束,以避免序號重復,
mysql一張表中只能有一個auto_increment字段,
當使用truncate table table_name 刪除全部數據時,auto_increment會從1重新開始編號,
自增字段的值只能一次加1,而不能像SQL Server數據庫中的自增約束一樣,每次加2、每次加3,
在InnoDB數據表中,不可通過 create table or alter table 的auto_increment=n 語句來改變自增初值。
7. 刪除指定名稱的約束
mysql中,一個字段的所有約束都可以同名約束名刪除,使用drop index語句:
alter table table_name drop index 約束名;