[英]#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表中的索引列表。 请检查下面。
我从以下查询中获取了索引表。
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.