我创建了2个表:
CREATE TABLE `Albums_On_Facebook` (
`Album_Id` int(11) unsigned NOT NULL,
`Facebook_Album_Id` bigint(20) unsigned NOT NULL,
`Open_Time` datetime NOT NULL COMMENT 'Album open time',
PRIMARY KEY (`Album_Id`,`Facebook_Album_Id`),
CONSTRAINT `Album_Id_Onfacebook-Fkey` FOREIGN KEY (`Album_Id`) REFERENCES `Albums` (`Album_Id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `Pictures_In_Album` (
`Facebook_Album_Id` bigint(20) unsigned NOT NULL,
`Faceook_Picture_Id` bigint(20) unsigned NOT NULL,
`Time_Taken` datetime NOT NULL COMMENT 'Time that the photo was taken',
`Description` text CHARACTER SET latin1 COMMENT 'caption of the photo',
`Source` text CHARACTER SET latin1 NOT NULL COMMENT 'Source of the photo',
`Latitude` float(10,6) NOT NULL COMMENT 'Location of where the photo was taken',
`Longitude` float(10,6) NOT NULL COMMENT 'Location of where the photo was taken',
`Is_Best_Picture` bit(1) NOT NULL COMMENT 'Best picture or not',
`Photographer_Facebook_Id` bigint(20) NOT NULL COMMENT 'User Facebook identity of the user',
PRIMARY KEY (`Facebook_Album_Id`,`Faceook_Picture_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我正在尝试添加此禁令:
ALTER TABLE `Pictures_In_Album`
ADD CONSTRAINT Facebook_Album_Id_PicInAlbum_fKey
FOREIGN KEY (`Facebook_Album_Id`)
REFERENCES `Albums_On_Facebook`(`Facebook_Album_Id`);
我收到了这个错误:
无法创建表'PicoNew。#sql-1cc8_6d29'(错误号:150)
为什么?
答案 0 :(得分:1)
您的Albums_On_Facebook
表中需要一个用于引用列的键。此列是PRIMARY KEY的次要列。这还不够:
[...]
MySQL要求外键和引用键上的索引 外键检查可以很快,不需要表扫描。在里面 引用表时,必须有一个索引所在的外键 列以相同顺序列为第一列。这样的 如果不是,则会自动在引用表上创建索引 存在。如果您创建,可能会稍后以静默方式删除此索引 另一个可用于强制执行外键约束的索引。 如果给定,则使用index_name,如前所述。
InnoDB允许外键引用任何索引列或组 列。 但是,在引用的表中,必须有一个索引 其中引用的列被列为的第一列 同样的顺序。(强调我)