我遇到了一个奇怪的问题。我试图添加一个外键到一个引用另一个表,但由于某种原因失败了。以我对MySQL有限的知识,唯一可能怀疑的是,在另一个表上有一个外键引用了我试图引用的表。

我已经在两个表上做了一个SHOW CREATE TABLE查询,sourcecodes_tags是带外键的表,sourcecodes是引用的表。

CREATE TABLE `sourcecodes` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_id` int(11) unsigned NOT NULL,
 `language_id` int(11) unsigned NOT NULL,
 `category_id` int(11) unsigned NOT NULL,
 `title` varchar(40) CHARACTER SET utf8 NOT NULL,
 `description` text CHARACTER SET utf8 NOT NULL,
 `views` int(11) unsigned NOT NULL,
 `downloads` int(11) unsigned NOT NULL,
 `time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 KEY `user_id` (`user_id`),
 KEY `language_id` (`language_id`),
 KEY `category_id` (`category_id`),
 CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

CREATE TABLE `sourcecodes_tags` (
 `sourcecode_id` int(11) unsigned NOT NULL,
 `tag_id` int(11) unsigned NOT NULL,
 KEY `sourcecode_id` (`sourcecode_id`),
 KEY `tag_id` (`tag_id`),
 CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1

下面是生成错误的代码:

ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE

当前回答

我的MySQL数据库也有同样的问题,但最后,我找到了一个适合我的解决方案。 因为在我的表中,从mysql的角度来看一切都很好(两个表都应该使用InnoDB引擎,每列的数据类型应该是相同的类型,参与外键约束)。 我所做的唯一一件事是禁用外键检查,然后在执行外键操作后启用它。 我采取的步骤:

SET foreign_key_checks = 0;
alter table tblUsedDestination add constraint f_operatorId foreign key(iOperatorId) references tblOperators (iOperatorId); Query
OK, 8 rows affected (0.23 sec) Records: 8  Duplicates: 0  Warnings: 0
SET foreign_key_checks = 1;

其他回答

UPDATE sourcecodes_tags
SET sourcecode_id = NULL
WHERE sourcecode_id NOT IN (
  SELECT id FROM sourcecodes);

应该有助于摆脱这些id。或者如果sourcecode_id中不允许为空,则删除这些行或将那些缺失的值添加到sourcecodes表中。

我遇到了同样的问题,我检查了我的表行,发现有一些不兼容的字段值,我想定义一个外键。我修正了这些值,再次尝试,问题解决了。

清空两个表的数据并运行该命令。它会起作用的。

似乎有一些无效值的列0不是一个有效的外键,所以MySQL不能为它设置外键约束。

你可以遵循以下步骤:

删除您试图为其设置FK约束的列。 再次添加它,并将其默认值设置为NULL。 尝试再次为它设置外键约束。

我的MySQL数据库也有同样的问题,但最后,我找到了一个适合我的解决方案。 因为在我的表中,从mysql的角度来看一切都很好(两个表都应该使用InnoDB引擎,每列的数据类型应该是相同的类型,参与外键约束)。 我所做的唯一一件事是禁用外键检查,然后在执行外键操作后启用它。 我采取的步骤:

SET foreign_key_checks = 0;
alter table tblUsedDestination add constraint f_operatorId foreign key(iOperatorId) references tblOperators (iOperatorId); Query
OK, 8 rows affected (0.23 sec) Records: 8  Duplicates: 0  Warnings: 0
SET foreign_key_checks = 1;