1. 程式人生 > 實用技巧 >mysq foreign外來鍵記錄

mysq foreign外來鍵記錄

MySQL的外來鍵約束FOREIGN KEY

一、建立外來鍵約束

[CONSTRAINT [symbol]] FOREIGN KEY
 [index_name] (col_name, ...)
 REFERENCES tbl_name (col_name,...)
 [ON DELETE reference_option]
 [ON UPDATE reference_option]
reference_option:
 RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

1.CONSTRAINT [symbol]]指定約束名字,不寫則系統自動生成外來鍵約束名;

2.MySQL強制外來鍵約束的列上必須要有索引, [index_name]指定索引名,不寫則系統自動生成索引名,如果已經存在可以用於支援外來鍵約束的索引,那麼指定的索引名則無效,採用已有的索引;
3.[ON DELETE reference_option]和[ON UPDATE reference_option]指定主表update和delete操作時,子表對應的資料怎麼響應;
  • cascade:從父表刪除或者更新且自動刪除或更新子表中匹配的行
  • set null:從父表刪除或更新行,並設定子表中的外來鍵行為null,如果使用該選項,必須保證子表列沒有指定not null
  • restrict:拒絕對父表的刪除或更新操作。
  • no action:標準SQL的關鍵字,在mysql中於restrict相同

二、新增外來鍵約束

ALTER TABLE tbl_name
 ADD [CONSTRAINT [symbol]] FOREIGN KEY
 [index_name] (col_name, ...)
 REFERENCES tbl_name (col_name,...)
 [ON DELETE reference_option]
 [ON UPDATE reference_option]

三、刪除外來鍵約束

Alter table 表名 add constraint FK_ID foreign key(外來鍵欄位名) REFERENCES 外表表名(主鍵欄位名);

fk_symbol即外來鍵約束名,如果不知道具體是什麼,可以使用show create table tab_name\G來檢視。

四、外來鍵約束注意事項

  • 外來鍵上無法插入主表沒有的資料,也無法更新為主表沒有的資料;
  • 外來鍵上必須要有索引,主表上對應的列最好也建立索引,因為當子表外來鍵插入資料時,也是需要到主表對應的列上去檢查資料是否存在,有索引可以提高效率;
  • 如果一個表被其他表的外來鍵引用,則這個表無法被刪除;如果通過set foreign_key_checks=0強制刪除主表,則子表無法插入任何資料;
  • 外來鍵的欄位型別,字符集必須要跟引用的欄位一致,unsigned屬性也要一致,否則無法建立外來鍵約束;
  • 被引用的列上必須要有索引,否則無法建立外來鍵約束。