繁体   English   中英

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

[英]#1005 - Can't create table errno: 150

在问这个问题之前,我在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`)
   )

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

我看到了错误No:150 ,我对索引感到困惑。

我还有mlm_rtmfx_users表中的索引列表。 请检查下面。

mlm_rtmfx_users索引

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

SHOW INDEX FROM mlm_rtmfx_users

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

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

您有一些mlm_rtmfx_users中引用的列已编制索引,但每个引用的列必须具有与引用表中的FOREIGN KEY列的索引匹配的索引。 因此,您需要在side,leg,parent_key,user上添加索引。

如果减少username的长度,则每个索引的InnoDB限制不会超过767字节。

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`)
 )

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

将附加索引添加到父表(并将username长度减少到InnoDB的索引限制)后,可以成功创建表。 这是在行动

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM