外鍵僅 InnoDB 支持,本文通過父表 biao、子表 cotton(1:N)實例,講解創建語法、字段類型匹配要求、及圖形工具導出差異。
CREATE TABLE `biao` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `title` VARCHAR(11) DEFAULT NULL, `content` VARCHAR(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
CREATE TABLE `cotton` ( `id` INT PRIMARY KEY, `user` VARCHAR(11), `email` VARCHAR(11), `url` VARCHAR(11), `content` VARCHAR(11), `addTime` DATE, `biao_id` INT, CONSTRAINT `FK_biao_id` FOREIGN KEY (`biao_id`) REFERENCES `biao` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
biao_id 與被引用列 id:**類型、長度、符號位、字符集**必須一模一樣。id INT(11),子表 biao_id INT 兼容;若父表 INT UNSIGNED,子表也必須 UNSIGNED。VARCHAR(11) 長度必須一致,否則報錯 ERROR 1005 (HY000): Can't create table ... errno: 150。圖形工具常將外鍵拆分為兩步導出:
-- 1. 建表時僅創建索引 CREATE TABLE `comment` ( `id` INT(11) NOT NULL, `blog_id` INT(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `FK_blog_id` (`blog_id`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312; -- 2. 後續 ALTER TABLE 添加外鍵約束 ALTER TABLE `comment` ADD FOREIGN KEY (`blog_id`) REFERENCES `blog` (`id`);
這是為了避免建表順序導致的引用表不存在問題,功能等價。
CONSTRAINT `fk_name` FOREIGN KEY (`col`) REFERENCES `parent` (`id`) ON DELETE CASCADE -- 級聯刪除 ON UPDATE RESTRICT -- 禁止更新父鍵 ON DELETE SET NULL -- 置空子鍵 ON UPDATE CASCADE -- 級聯更新父鍵
ENGINE=InnoDB。