首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 外鍵創建實戰:語法、坑點與工具導出差異

     編輯:MySQL 資料庫相關知識

MySQL InnoDB 外鍵定義完整示例與常見錯誤避坑

外鍵僅 InnoDB 支持,本文通過父表 biao、子表 cotton(1:N)實例,講解創建語法、字段類型匹配要求、及圖形工具導出差異。

核心 SQL 示例

父表(被引用表)

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;

子表(引用表)—— 內聯 CONSTRAINT 寫法

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。

工具導出差異(SQLyog / Navicat / phpMyAdmin)

圖形工具常將外鍵拆分為兩步導出:

-- 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      -- 級聯更新父鍵

總結檢查清單

  1. 兩表均為 ENGINE=InnoDB。
  2. 父表被引用列有索引(主鍵或唯一索引)。
  3. 子表引用列建立索引(MySQL 自動創建)。
  4. 字段類型、長度、字符集、校驗規則**完全一致**。
  5. 父表數據已存在或允許 NULL。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved