MYSQL 无法创建 Table: 错误 150

MYSQL Cannot Create Table: Error 150

我正在尝试使用外键创建一些 table,但是我无法通过错误 150。它还说错误 1005 无法创建 table 别名。

这是我的脚本:

DROP TABLE IF EXISTS `Aliases`;
CREATE TABLE `Aliases` (
  `aliasnum` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `usernum` bigint(20) unsigned NOT NULL DEFAULT '0',
  `address` varchar(255) NOT NULL DEFAULT '',
  `display` varchar(255) NOT NULL DEFAULT '',
  `selected` tinyint(1) NOT NULL DEFAULT '0',
  `created` datetime NOT NULL,
  PRIMARY KEY (`aliasnum`),
  UNIQUE KEY `UNIQ_DISPLAY` (`usernum`,`address`,`display`),
  KEY `IX_USERNUM` (`usernum`),
  KEY `IX_USERNUM_ADDRESS` (`usernum`,`address`),
  CONSTRAINT `Aliases_fk_1` FOREIGN KEY (`usernum`, `address`) REFERENCES `Mailboxes` (`usernum`, `address`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 MAX_ROWS=4294967295 AVG_ROW_LENGTH=100 COMMENT='Store mailbox display aliases and default status information.';

DROP TABLE IF EXISTS `Mailboxes`;
CREATE TABLE `Mailboxes` (
  `address` varchar(255) NOT NULL DEFAULT '',
  `usernum` bigint(20) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`address`),
  KEY `IX_USERNUM` (`usernum`),
  KEY `IX_USERNUM_ADDRESS` (`usernum`,`address`),
  CONSTRAINT `Mailboxes_ibfk_1` FOREIGN KEY (`usernum`) REFERENCES `Users` (`usernum`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 MAX_ROWS=4294967295 AVG_ROW_LENGTH=100 COMMENT='All mailboxes for which we accept e-mail.';

错误显示第 29 行是:

`selected` tinyint(1) NOT NULL DEFAULT '0',

所有 table 都是 InnoDB。我真的卡住了,不确定它是什么?

删除

CONSTRAINT `Aliases_fk_1` FOREIGN KEY (`usernum`, `address`) REFERENCES `Mailboxes` (`usernum`, `address`) ON DELETE CASCADE ON UPDATE CASCADE

CONSTRAINT `Mailboxes_ibfk_1` FOREIGN KEY (`usernum`) REFERENCES `Users` (`usernum`) ON DELETE CASCADE ON UPDATE CASCADE

create table 命令中。

创建表后添加FOREIGN KEY

ALTER TABLE `Aliases` 
ADD CONSTRAINT `Aliases_fk_1` 
FOREIGN KEY (`usernum`, `address`) 
REFERENCES `Mailboxes` (`usernum`, `address`) 
ON DELETE CASCADE 
ON UPDATE CASCADE;

ALTER TABLE `Mailboxes`
ADD CONSTRAINT `Mailboxes_ibfk_1` 
FOREIGN KEY (`usernum`)
REFERENCES `Users` (`usernum`)
ON DELETE CASCADE
ON UPDATE CASCADE;

您的第一个 table 有一个引用第二个的约束。所以调换创建顺序。

当然,你的第二个 table 有一个约束,它指的是你在问题中没有提到的其他 table Users。因此,您必须先创建 Users,然后是 Mailboxes,然后是 Aliases

或者,您可以从 table 定义中删除 CONSTRAINT 子句,然后在您的 table 全部可用后创建约束,就像这样。

CREATE TABLE Users
CREATE TABLE Aliases ...
CREATE TABLE Mailboxes ...

ALTER TABLE Aliases ADD
  CONSTRAINT `Aliases_fk_1` FOREIGN KEY (`usernum`, `address`) REFERENCES `Mailboxes` (`usernum`, `address`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE Mailboxes ADD
  CONSTRAINT `Mailboxes_ibfk_1` FOREIGN KEY (`usernum`) REFERENCES `Users` (`usernum`) ON DELETE CASCADE ON UPDATE CASCADE;

(我认为第 29 行不相关。)