当 MySQL 返回 #1215 - Cannot add foreign key constraint
错误时,这表明在创建外键约束的过程中遇到了问题。以下是几种常见的原因:
数据类型不匹配:外键列和引用列的数据类型必须一致,不然就无法创建外键约束。
字符集和排序规则不匹配:如果外键列和引用列的字符集或者排序规则不同,也会导致无法创建外键约束。
引用的表或列不存在:当引用的表或者列不存在时,无法创建外键约束。
现有数据违反约束:若表中已有数据不满足外键约束条件,同样无法创建外键约束。
在你给出的 SQL 代码里,创建外键约束时可能出现上述问题。下面是详细的检查和修复步骤:
要保证 articles
表中的 user_id
和 status_id
列的数据类型,与 users
表的 id
列以及 article_status
表的 id
列的数据类型一致。在你的代码中,这些列均为 INT
类型,这部分没有问题。
确保所有涉及的列字符集和排序规则相同。一般而言,使用默认的设置就可以。
要确保在创建 articles
表之前,users
表和 article_status
表已经存在。
如果 articles
表中已经存在数据,要保证 user_id
和 status_id
的值在 users
表的 id
列和 article_status
表的 id
列中存在。
以下是按照正确顺序创建表和插入数据的 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
错误。