#1005 - 无法创建表错误:150

时间:2014-07-19 13:12:52

标签: mysql

在提出这个问题之前,我在Stackoerflow中看到了很多问题

当我执行以下mlm_commission创建表查询时,

我收到以下错误。

  

1005 - 无法创建表'mlm_new.mlm_commission'(错误号码:150)(详情......)

此外,当我单击“详细信息”时,我收到了以下文本

  

支持事务,行级锁定和外键

创建佣金表

CREATE TABLE IF NOT EXISTS mlm_commission
                (`weekno` int(11) NOT NULL,
                `level` int(11) NOT NULL,
                `username` varchar(500) NOT NULL,
                `PositionA` int(11) NOT NULL,
                `CFPositionA` int(11) NOT NULL,
                `PositionB` int(11) NOT NULL,
                `CFPositionB` int(11) NOT NULL,
                `PositionC` int(11) NOT NULL,
                `CFPositionC` int(11) NOT NULL,
                `ABLeft` int(11) NOT NULL,
                `CFABLeft` int(11) NOT NULL,
                `ABRight` int(11) NOT NULL,
                `CFABRight` int(11) NOT NULL,
                `CLeft` int(11) NOT NULL,
                `CFCLeft` int(11) NOT NULL,
                `CRight` int(11) NOT NULL,
                `CFCRight` int(11) NOT NULL,
                `ABMatchingPair` int(11) NOT NULL,
                `CMatchingPair` int(11) NOT NULL,
                `IsIncludedToParent` enum('Y','N'),
                `side` enum('L','R') NOT NULL,
                `leg` enum('0','1','2') NOT NULL,
                `parent_key` varchar(15) NOT NULL,
                `commission` int(11) NOT NULL,
                FOREIGN KEY(`username`) REFERENCES mlm_rtmfx_users(`username`),
                FOREIGN KEY(`side`) REFERENCES mlm_rtmfx_users(`side`),
                FOREIGN KEY(`leg`) REFERENCES mlm_rtmfx_users(`leg`),
                FOREIGN KEY(`parent_key`) REFERENCES mlm_rtmfx_users(`parent_key`),
                PRIMARY KEY(`username`,`weekno`,`level`));

我在下表中的mlm_rtmfx_commission表中引用了4个外键值。

CREATE TABLE `mlm_rtmfx_users` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `user_id` varchar(1023) NOT NULL,
   `username` varchar(500) NOT NULL,
   `user_key` varchar(15) NOT NULL,
   `parent_key` varchar(15) NOT NULL,
   `sponsor_key` varchar(15) NOT NULL,
   `leg` enum('0','1','2') NOT NULL,
   `payment_status` enum('0','1') NOT NULL,
   `pinno` int(11) NOT NULL,
   `user_password` varchar(8) NOT NULL,
   `side` enum('L','R') NOT NULL,
   `iseligible` enum('Y','N') NOT NULL,
   `created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
   )

您可以检查每个外键引用是否具有相同的名称和类型。

我见过这个Error No:150,我对索引感到困惑。

我还有mlm_rtmfx_users表中的索引列表。请查看以下内容。

mlm_rtmfx_users index

我从以下查询中获得了索引表。

SHOW INDEX FROM mlm_rtmfx_users

请澄清我哪里出错了?如果我的问题不明确,请告诉我。

1 个答案:

答案 0 :(得分:3)

FOREIGN KEY创建有两个要求。首先,引用列必须与引用的列具有完全相同的数据类型。其次,引用的列必须与引用列完全一样索引。也就是说,如果您有3个单FOREIGN KEY个,则在引用的表上需要3个相应的索引。如果您有一个包含3列的化合物FOREIGN KEY,则需要在引用表中的相同3列上使用相应的复合索引。

您已在<{1}}索引中引用了部分列,但所引用列的每个必须具有与{{1}匹配的索引引用表中的列。因此,您需要在mlm_rtmfx_users上添加索引。

如果缩短FOREIGN KEY的长度,则每个索引的InnoDB限制不会超过767字节。

side,leg,parent_key,user

如果必须保留长度为500的username,则需要enable innodb_long_prefix来增加索引的允许字节长度。

将附加索引添加到父表(并将CREATE TABLE `mlm_rtmfx_users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` varchar(1023) NOT NULL, `username` varchar(50) NOT NULL, `user_key` varchar(15) NOT NULL, `parent_key` varchar(15) NOT NULL, `sponsor_key` varchar(15) NOT NULL, `leg` enum('0','1','2') NOT NULL, `payment_status` enum('0','1') NOT NULL, `pinno` int(11) NOT NULL, `user_password` varchar(8) NOT NULL, `side` enum('L','R') NOT NULL, `iseligible` enum('Y','N') NOT NULL, `created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), -- More indices are needed in the parent table: INDEX (`username`), INDEX (`side`), INDEX (`leg`), INDEX (`parent_key`) ) 长度减少到InnoDB的索引限制),可以成功创建表。 Here it is in action