外鍵約束的要求
父表和子表必須使用相同的儲存引擎,而且禁止使用臨時表
數據表的儲存引擎只能為InnoDB:
外鍵列(字段)和參照列必須具有相似的數據類型,其中數字的長度或是否有符號位必須相同,而字符類型的字段的長度則可以不同
外鍵列(字段)和參照列(即外鍵列在另一個表中對應的主鍵列)必須創建索引,如果外鍵不存在索引(即外鍵約束)的話,MySQL將自動給外鍵列自動創建索引(外鍵約束)
步驟
- 設置儲存引擎
my.ini 設置儲存引擎
default-storage-engine=INNODB
- 創建兩張數據表(例):
CREATE TABLE provinces(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
proName VARCHAR(20) NOT NULL
);
SHOW CREATE TABLE provinces; // 查看數據表創建詳細信息
CREATE TABLE users(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
userName VARCHAR(10) NOT NULL,
pid SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES provinces(id)
);
如果 外鍵字段和參照列字段數據類型不同,會報1005錯誤
外鍵約束的操作:
CASCADE:從父表刪除或更新會自動刪除或更新子表中匹配的行
SET NULL:從父表刪除或更新行,會設置子表中的外鍵列為NULL,但必須保證子表列沒有指定NOT NULL
RESTRICT:拒絕對父表的刪除或更新操作(如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作,這個是ANSI SQL-92標準,從mysql4.0.8開始支持)
NO ACTION:標準SQL的關鍵字,在mysql中與RESTRICT相同