在提出这个问题之前,我在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表中的索引列表。请查看以下内容。
我从以下查询中获得了索引表。
SHOW INDEX FROM mlm_rtmfx_users
请澄清我哪里出错了?如果我的问题不明确,请告诉我。
答案 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