2012-07-10 115 views
1

我试图执行以下SQL并收到errno:150'无法创建表path_relations'作为响应。根据MySQL文档,这是由我的FOREIGN KEY约束引起的问题。我究竟做错了什么?将FOREIGN KEY表添加到MySQL数据库导致errno 150

DROP TABLE IF EXISTS `paths`; 
DROP TABLE IF EXISTS `path_relations`; 

CREATE TABLE `paths` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(256) CHARACTER SET utf8 DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE `path_relations` (
    `ancestor` int(11) NOT NULL DEFAULT '0', 
    `descendant` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY(`ancestor`, `descendant`), 
    FOREIGN KEY(`ancestor`) REFERENCES paths(`id`), 
    FOREIGN KEY(`descendant`) REFERENCES paths(`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

回答

3

如果您制作paths.id而不是未签名?

+0

2应该是平等的,他们不是现在,固定无符号的一种方式或其他将帮助 – Nanne 2012-07-10 13:51:00

-1

更新:在第一个表定义你的整数值无符号而在你还没有第二个。这些字段必须在结构上相同以满足外键。

表中是否有任何数据?如果是这样,确保所有记录都能满足约束条件。外键列中的NULL值将阻止其工作。

+0

我不会这样想。看起来他在试图创建它们之前放弃了两张表。 – 2012-07-10 13:49:37

+0

绝对正确,只是再看一次,其原因是一个表的定义包括无符号,而另一个没有。将更新我的答案。 – idodev 2012-07-10 13:50:58

4

这里是你一个清单,好运;)

1)型外键源和参考场的必须相同

2)源和参考字段必须是无符号

3)源字段必须索引

4)两个表必须是InnoDB

+1

为什么这是downvoted?有一些部分是错的吗?对我来说似乎是一个很好的答案。 – 2012-07-10 13:52:07

+1

我不确定。我也可以说,因为他需要他们都没有签名。但我了解到:“给一个人一条鱼,你给他一天的时间,教一个人钓鱼,你养活他一辈子。”猜我错了:( – Timmetje 2012-07-10 13:54:54

+1

看起来不错:) :) – 2012-07-10 13:55:47