即使数据类型相同,外键约束也会失败

时间:2014-11-15 03:13:57

标签: mysql sql foreign-keys

我正在构建一个带有两部分外键的表,该外键引用另一个表中的两部分键。它不起作用,我无法理解为什么因为数据类型排列。

Can't create table 'tsugi.video_comments' (errno: 150)

这是我正在尝试运行的代码:

CREATE TABLE `video_comments` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `video_id` varchar(11) NOT NULL DEFAULT '',
  `link_id` int(11) NOT NULL,
  `videoTime` int(11) NOT NULL,
  `comment` text NOT NULL,
  `parent` int(11) unsigned DEFAULT NULL,
  `private` tinyint(1) DEFAULT NULL,
  `replies` int(11) unsigned DEFAULT '0',
  `reports` int(11) DEFAULT '0',
  `user_id` int(11) NOT NULL,
  `displayname` varchar(2048) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `video_ibfk_1` (`link_id`),
  KEY `video_ibfk_2` (`user_id`),
  CONSTRAINT `video_comments_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `video_comments` (`id`) ON DELETE CASCADE,
  CONSTRAINT `video_ibfk_1` FOREIGN KEY (`link_id`) REFERENCES `lti_link` (`link_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `video_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `lti_user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `video_key` FOREIGN KEY (`link_id`, `video_id`) REFERENCES `video_ids` (`link_id`, `video_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=285 DEFAULT CHARSET=utf8;

如果我删除了最后一个约束,那么该命令会成功运行,因此这就是问题所在,而不是其他约束。

这是它引用的表格:

CREATE TABLE `video_ids` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `video_id` varchar(11) NOT NULL DEFAULT '',
  `link_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `video_key` (`video_id`,`id`),
  KEY `link_id` (`link_id`),
  KEY `id` (`id`,`video_id`),
  CONSTRAINT `video_ids_ibfk_1` FOREIGN KEY (`link_id`) REFERENCES     `t_lti_link` (`link_id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

为了确保video_id和link_id字段完全相同,我将它们直接从现有表的代码复制到用于创建新表的代码中。我希望能解决它,但事实并非如此。这是错误日志:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
141114 22:04:09 Error in foreign key constraint of table tsugi/video_comments:
 FOREIGN KEY (`link_id`, `video_id`) REFERENCES `video_ids` (`link_id`,     `video_id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=285 DEFAULT CHARSET=utf8:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

1 个答案:

答案 0 :(得分:0)

外键引用需要唯一或主键。因此,您只需在unique中声明video_ids声明即可解决此问题:

CREATE TABLE `video_ids` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `video_id` varchar(11) NOT NULL DEFAULT '',
  `link_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `video_key` (`video_id`,`id`),
  KEY `link_id` (`link_id`),
  KEY `id` (`id`,`video_id`),
  UNIQUE (link_id, video_id),
  CONSTRAINT `video_ids_ibfk_1` FOREIGN KEY (`link_id`) REFERENCES     `t_lti_link` (`link_id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

Here是一个带有示例的SQL小提琴。