Mysql 无法添加或更新子行:外键约束失败-Don';我不明白这怎么可能?

Mysql 无法添加或更新子行:外键约束失败-Don';我不明白这怎么可能?,mysql,sql,Mysql,Sql,我是SQL新手,读过一些关于这个错误的其他例子,但我似乎不能完全理解它。 这是我的虚拟数据 我创建了一个表并将其命名为blogPosts CREATE TABLE blogPosts ( blog_id INT PRIMARY KEY AUTO_INCREMENT, author_id INT DEFAULT 1, blog_title VARCHAR(200), date_created DATE, genre VARCHAR(20) ); 然后我创建

我是SQL新手,读过一些关于这个错误的其他例子,但我似乎不能完全理解它。 这是我的虚拟数据

我创建了一个表并将其命名为blogPosts

CREATE TABLE blogPosts (
    blog_id INT PRIMARY KEY AUTO_INCREMENT,
    author_id INT DEFAULT 1,
    blog_title VARCHAR(200),
    date_created DATE,
    genre VARCHAR(20)
);
然后我创建了一个表,并将其命名为author:

CREATE TABLE author (
    author_id INT PRIMARY KEY AUTO_INCREMENT,
    author_name VARCHAR(75)
);
然后,我为blogPosts创建了一个外键,它引用了author_id的author表,并且工作正常

ALTER TABLE blogPosts ADD FOREIGN KEY(author_id)
REFERENCES author(author_id) ON DELETE SET NULL;

这是我的问题。当我创建这个名为genres的新表时,我尝试做同样的事情,从blogPosts创建一个外键,并将其与genres表的主键链接,但失败了

  CREATE TABLE genres(
        genre_name VARCHAR(20) UNIQUE PRIMARY KEY
    );
ALTER TABLE blogPosts ADD FOREIGN KEY(genre) REFERENCES genres(genre_name) ON DELETE SET NULL;
ER\u NO\u REFERENCED\u ROW\u 2:无法添加或更新子行:外键约束失败(
dunder\u mifflin
,约束
blogsposts\u ibfk\u 2
外键(
genre
)引用
genres
genre\u name
)删除集空)


我真的不知道为什么会这样。任何建议都将不胜感激,谢谢

您的代码似乎在MySQL上运行良好,下面是它的dbfiddle:

MySQL(通常为**)在创建约束时尝试强制执行外键约束。如果引用字段中已存在数据,则引用字段必须包含这些值的组合,否则无法强制执行约束


**禁用
foreign\u key\u checks
可能允许在不确保存在引用数据的情况下创建约束,但重新启用它们不会尝试在面之后强制任何违反约束的行为,使数据处于不可靠的状态(实际上不符合约束).

如果您在
blogPosts.genre
中已有值,则在创建FK之前,这些值必须在
genres.genre\u name
中。@ueerdo Mind blog bro。我自己是不会想到的。因此,从现在开始,如果我想创建一个外键来链接表,我正在链接的表也必须先填充值,然后才能继续。好啊是的,如果已经存在的数据违反了外键约束,它将不会创建外键约束。@noobcoderiam它有什么好激动的?这不是
外键的用途吗?阻止用户输入所需的任何值。您将按哪个顺序运行这些命令?即使我先填充体裁,然后再填充博客帖子,也会失败。我想我明白了,但我猜我错了,lolI不建议对类似的内容禁用外键检查,如果在添加对blogpost的限制之前,数据以genre.genre\u name的形式存在,那么您应该不会有问题。在确保数据存在后,是否会收到不同的错误消息?此外,再次检查以确保引用字段和引用字段具有匹配/兼容的类型。这是同样的错误,这很奇怪。这次我首先创建了“类型和作者”表。将数据插入到这些表中。然后,我用外键创建了blogPosts表,但当我尝试插入数据时,再次收到相同的错误消息。按照执行顺序包含完整的创建和插入。事实上,它起作用了,我想我在输入数据的过程中犯了一个错误,这是造成它的原因-但你第一次是对的,我确实理解你所说的。我感谢你的帮助:)
CREATE TABLE blogPosts (
    blog_id INT PRIMARY KEY AUTO_INCREMENT,
    author_id INT DEFAULT 1,
    blog_title VARCHAR(200),
    date_created DATE,
    genre VARCHAR(20)
);
CREATE TABLE author (
    author_id INT PRIMARY KEY AUTO_INCREMENT,
    author_name VARCHAR(75)
);

ALTER TABLE blogPosts ADD FOREIGN KEY(author_id)
REFERENCES author(author_id) ON DELETE SET NULL;

CREATE TABLE genres(
        genre_name VARCHAR(20) UNIQUE PRIMARY KEY
    );

ALTER TABLE blogPosts ADD FOREIGN KEY(genre) REFERENCES genres(genre_name) ON DELETE SET NULL;

insert into author(author_name) values ('Ritchie');

insert into genres (genre_name) values ('CS');


insert into blogPosts (author_id, blog_title, genre) values (1, 'Give me a beer, but not a Corona', 'CS');


select * from blogPosts;

select * From author;

select * From genres;