【发布时间】:2012-04-19 04:04:59
【问题描述】:
我想将外键添加到名为“katalog”的表中。
ALTER TABLE katalog
ADD CONSTRAINT `fk_katalog_sprache`
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;
当我尝试这样做时,我收到以下错误消息:
Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150)
INNODB 状态错误:
120405 14:02:57 表外键约束出错 mytable.#sql-7fb1_7d3a:
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL:
Cannot resolve table name close to:
(`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL
当我使用此查询时,它可以工作,但“删除时”操作错误:
ALTER TABLE `katalog`
ADD FOREIGN KEY (`Sprache` ) REFERENCES `sprache` (`ID` )
两个表都是 InnoDB,两个字段都是“INT(11) not null”。我正在使用 MySQL 5.1.61。尝试在 MacBook Pro 上使用 MySQL Workbench(最新)触发此 ALTER 查询。
表创建语句:
CREATE TABLE `katalog` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`AnzahlSeiten` int(4) unsigned NOT NULL,
`Sprache` int(11) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `katalogname_uq` (`Name`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC$$
CREATE TABLE `sprache` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Bezeichnung` varchar(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `Bezeichnung_UNIQUE` (`Bezeichnung`),
KEY `ix_sprache_id` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
【问题讨论】:
-
既然你没有发布
SHOW CREATE TABLE的输出,我只能问——列名真的是ID,大写吗? -
嗯,现在更容易发现 -
katalog有int(11) unsigned。sprache没有usigned部分,因此两列不一样。 -
你的意思是,两个主字段必须是相同的数据类型?
-
这是您设计的问题:首先,您引用了两个
auto_increment列,这很糟糕。此外,MySQL 手册说:Corresponding columns in the foreign key and the referenced key must have similar internal data types inside InnoDB so that they can be compared without a type conversion. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same.。因此,是的,相似数据类型和符号相同。 -
我没有引用两个 auto_increment 字段。 katalog.Sprache(非自动)-> sprache.ID(自动)
标签: mysql foreign-keys