MySql错误150,不知道为什么

时间:2014-07-30 12:30:33

标签: mysql database

我创建了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)

为什么?

1 个答案:

答案 0 :(得分:1)

您的Albums_On_Facebook表中需要一个用于引用列的键。此列是PRIMARY KEY的次要列。这还不够:

  

Using FOREIGN KEY Constraints

[...]

  

MySQL要求外键和引用键上的索引   外键检查可以很快,不需要表扫描。在里面   引用表时,必须有一个索引所在的外键   列以相同顺序列为第一列。这样的   如果不是,则会自动在引用表上创建索引   存在。如果您创建,可能会稍后以静默方式删除此索引   另一个可用于强制执行外键约束的索引。   如果给定,则使用index_name,如前所述。

     

InnoDB允许外键引用任何索引列或组   列。 但是,在引用的表中,必须有一个索引   其中引用的列被列为的第一列   同样的顺序。(强调我)