1.約束
約束保證了數據的完整性和一致性。
約束分為表級約束和列級約束,針對一個字段的約束稱為列級約束,針對兩個及兩個以上的約束稱為表級約束。
3.約束類型包括
NOT NULL(非空約束)
PRIMARY KEY(主鍵約束)
UNIQUE KEY(唯一約束)
DEFAULT KEY(默認約束)
FOREIGN KEY(外鍵約束)
首先我來介紹一下外鍵約束的要求
1.父表和子表必須使用相同的存儲引擎(必須使用ZNNODB)。而且禁止使用臨時表。
2.數據表和參照表必須具有相似的數據類型。其中數字的長度或者是否有符號位必須相同;但是如果是字符的話,長度可以不同。
3.外鍵列和參照列必須創建索引,如果外鍵列不存在索引的話,MYSQL將自動創建索引。
這里我們插入一句話,如何編輯數據表的存儲引擎?
在mysql配置文件中
default-storage-engine=INNODB;
例子:
父表:
CREATE TABLE provinces(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL
)
子表:
CREATE TABLE users(
id SMALL UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL;
pid SMALLINT UNSIGNED,
FOREIGN(pid) REFERRENCE provinces(id);
)
外鍵約束的參照操作
1 CASCADE:從父表中刪除或者更新且自動刪除或者更新子表中的匹配的行
2.SET NULL:從父表刪除或者更新行,並設置子表中的外鍵列為null,如果使用了該選項,必須保證子表列沒有指定NOT NULL
3 .RESIRICT :拒絕父表的刪除或者更新操作
4.NOT NULL:標准SQL的關鍵字,在MYSQL中與RESIRCT相同。
再舉一個例子
父表:
CREATE TABLE provinces(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL
)
子表:
CREATE TABLE users(
id SMALL UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL;
pid SMALLINT UNSIGNED,
FOREIGN(pid) REFERRENCE provinces(id) ON DELETE CASCADE;
)
這時如果刪除父表中的id是可以的,相應的建立外鍵時,對兩個表進行插值必須先完成父表,在來完成子表,看下面的操作:
INSERT provinces(pname) VALUES("A").
INSERT provinces(pname) VALUES("B")
INSERT provinces(pname) VALUES("C")
INSERT users(username,pid) VALUES("TOM",3);
INSERT users(username,pid) VALUES("john",2);
不能插入(1,2,3)之外的其他的數,因為provinces中的id值只有1,2,3
如果DELETE * FROM provinces WHERE id=3;
那么users中pid=3的也刪除了。