2012年11月29日 星期四

[轉][mysql][foreign key外來鍵]mysql InnoDB

*mysql儲存引擎是預設MyISAM,但不支援外來鍵
*而InnoDB支援外來鍵,



1.記得 MySQL 預設是不支援 Foreign Key 的功能
2.MySQL 中有相關的套件了,只是沒有開啟而已
3.InnoDB 是 MySQL 上第一個提供外鍵約束的表引擎。
4.如何啟動:請在 my.ini 中將 skip-innodb 這行用 # 號註解掉。

CREATE TABLE parent(
   id INT NOT NULL,
   PRIMARY KEY (id)
) ENGINE = INNODB;

CREATE TABLE child(
   id INT,
   parent_id INT,
   INDEX par_ind (parent_id),
   FOREIGN KEY(parent_id) REFERENCES parent(id) ON DELETE CASCADE
) ENGINE = INNODB;
-- 參數:
[ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
[ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]

當關聯父資料表的主鍵紀錄行被刪除或修改時,InnoDB 對子資料表中紀錄行的處理方式:
CASCADE - 會將有所關聯的紀錄行也會進行刪除或修改。
SET NULL - 會將有所關聯的紀錄行設定成 NULL。
NO ACTION - 有存在的關聯紀錄行時,會禁止父資料表的刪除或修改動作。
RESTRICT - 與 NO ACTION 相同。

詳細的錯誤訊息可以在 MySQL 指令模式下輸入:
SHOW engine innodb status;

由於會列出很多資料,所以要找一下,在訊息中有一组【LATEST FOREIGN KEY ERROR】會有最近錯誤的詳細描述和解决辦法。

當關聯父資料表的主鍵紀錄行被刪除修改時,InnoDB 對子資料表中紀錄行的處理方式:
CASCADE - 會將有所關聯的紀錄行也會進行刪除或修改。
SET NULL - 會將有所關聯的紀錄行設定成 NULL。
NO ACTION - 有存在的關聯紀錄行時,會禁止父資料表的刪除或修改動作。
RESTRICT - 與 NO ACTION 相同。


參考資料:
http://jax-work-archive.blogspot.tw/2007/10/innodb-mysql-foreign-key.html

沒有留言:

張貼留言