编程笔记

编程笔记

MySQL 返回: 文档 #1215 - Cannot add foreign key constraint
2025-01-25

错误原因分析


当 MySQL 返回 #1215 - Cannot add foreign key constraint 错误时,这表明在创建外键约束的过程中遇到了问题。以下是几种常见的原因:


  1. 数据类型不匹配:外键列和引用列的数据类型必须一致,不然就无法创建外键约束。

  2. 字符集和排序规则不匹配:如果外键列和引用列的字符集或者排序规则不同,也会导致无法创建外键约束。

  3. 引用的表或列不存在:当引用的表或者列不存在时,无法创建外键约束。

  4. 现有数据违反约束:若表中已有数据不满足外键约束条件,同样无法创建外键约束。

针对你的代码检查与修复建议


在你给出的 SQL 代码里,创建外键约束时可能出现上述问题。下面是详细的检查和修复步骤:

1. 检查数据类型


要保证 articles 表中的 user_id 和 status_id 列的数据类型,与 users 表的 id 列以及 article_status 表的 id 列的数据类型一致。在你的代码中,这些列均为 INT 类型,这部分没有问题。

2. 检查字符集和排序规则


确保所有涉及的列字符集和排序规则相同。一般而言,使用默认的设置就可以。

3. 检查引用的表和列是否存在


要确保在创建 articles 表之前,users 表和 article_status 表已经存在。

4. 检查现有数据


如果 articles 表中已经存在数据,要保证 user_id 和 status_id 的值在 users 表的 id 列和 article_status 表的 id 列中存在。

修改后的 SQL 代码


以下是按照正确顺序创建表和插入数据的 SQL 代码:
-- 创建数据库
CREATE DATABASE article_management;

-- 使用数据库
USE article_management;

-- 创建用户表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    role ENUM('member', 'admin') DEFAULT 'member'
);

-- 创建文章状态表
CREATE TABLE article_status (
    id INT AUTO_INCREMENT PRIMARY KEY,
    status_name VARCHAR(20) NOT NULL
);

-- 插入文章状态数据
INSERT INTO article_status (status_name) VALUES ('待审核'), ('已通过'), ('未通过');

-- 创建文章表
CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT NOT NULL,
    user_id INT NOT NULL,
    status_id INT NOT NULL DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (status_id) REFERENCES article_status(id)
);

解释


  • 先创建 users 表和 article_status 表。

  • 接着向 article_status 表插入数据。

  • 最后创建 articles 表,此时引用的表和数据都已准备好,能够成功创建外键约束。


你可以运行修改后的 SQL 代码,这样应该就能解决 #1215 错误。