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 行不相关。)
我正在尝试使用外键创建一些 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 行不相关。)