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

MySQL 建立外鍵完整語法:主表/子表定義、命名約束、引擎限制

     編輯:MySQL 資料庫相關知識

MySQL 僅 InnoDB 支援外鍵約束。本文提供標準建表語法、ALTER TABLE 事後加外鍵、命名慣例、錯誤常見原因(引擎、欄位型別不符、索引缺失)。

完整建表範例:部落格文章 + 留言(1:N)

主表:blog

DROP TABLE IF EXISTS `blog`;
CREATE TABLE `blog` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `title` VARCHAR(100) DEFAULT NULL,
    `content` TEXT,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

子表:comment(建表時直接加外鍵)

DROP TABLE IF EXISTS `comment`;
CREATE TABLE `comment` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `user` VARCHAR(50) DEFAULT NULL,
    `email` VARCHAR(100) DEFAULT NULL,
    `content` TEXT,
    `add_time` DATETIME DEFAULT NULL,
    `blog_id` INT(11) DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `FK_comment_blog` (`blog_id`),
    CONSTRAINT `FK_comment_blog` FOREIGN KEY (`blog_id`) REFERENCES `blog` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

事後新增外鍵(ALTER TABLE)

-- 1. 先確保有索引
ALTER TABLE `comment` ADD INDEX `idx_blog_id` (`blog_id`);

-- 2. 新增外鍵約束
ALTER TABLE `comment` 
ADD CONSTRAINT `FK_comment_blog` 
FOREIGN KEY (`blog_id`) REFERENCES `blog` (`id`);

外鍵選項:ON DELETE / ON UPDATE

FOREIGN KEY (`blog_id`) REFERENCES `blog` (`id`)
    ON DELETE CASCADE      -- 刪除文章時,級聯刪除留言
    ON UPDATE CASCADE      -- 文章 ID 變更時,同步更新留言
-- 其他選項:SET NULL, RESTRICT, NO ACTION, SET DEFAULT

⚠️ 常見建立失敗原因

錯誤原因解決
Can't create table (errno: 150)引擎非 InnoDB兩表皆設 ENGINE=InnoDB
Data type mismatch參考欄位型別/長度/簽名不一致主鍵 INT(11),外鍵必須同為 INT(11)
No index on referenced column主表主鍵無索引(極罕見)主鍵自動有索引,檢查是否被刪
No index on foreign key column子表外鍵欄位無索引建立索引 KEY (blog_id)
Charset/Collation mismatch兩表字符集/排序規則不同統一 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

查看現有外鍵

SHOW CREATE TABLE comment\G
-- 或
SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_TYPE='FOREIGN KEY' AND TABLE_SCHEMA='db_name'

刪除外鍵

ALTER TABLE comment DROP FOREIGN KEY FK_comment_blog;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved