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
#1 楼
要将外键(grade_id)添加到现有表(用户),请按照以下步骤操作:ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0;
ALTER TABLE users ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id);
评论
原因可以帮助我理解和记住。这是因为您不能将外键添加到未签名的字段中,对吗?
–PixMach
15年9月28日在21:25
@PixMach,答案是否定的。您可以将带符号的整数作为外键。作为N.B.在问题上指出,字段的类型和符号必须匹配。因此,如果您在查找表中的主键是UNSIGNED,那么外键字段也必须是UNSIGNED。如果主键字段为SIGNED,则还必须对外键字段进行签名。这样想:无论一个表中的列是如SHOW CREATE TABLE中定义的,它都需要在另一个表中具有相同的定义。
– Ben Keene
16-09-19在20:38
请注意,这也可以通过单个查询来完成(在发生故障等情况下可能会更好)
– Stijn de Witt
16 Dec 3'在15:19
我必须运行“ SET FOREIGN_KEY_CHECKS = 0;”在运行ADD CONSTRAINT命令或SQL之前,它将抱怨“无法添加或更新子行:外键约束失败”。
–艾琳·盖尔(Erin Geyer)
17 Mar 8 '17 at 13:03
不要只运行“ SET FOREIGN_KEY_CHECKS = 0;”如果出现错误“外键约束失败”,则显然您必须修复错误的数据,否则将遇到更大的问题。
– MazeChaZer
18年6月11日在12:05
#2 楼
只需使用此查询,我就根据自己的情况进行了尝试,并且效果很好ALTER TABLE katalog ADD FOREIGN KEY (`Sprache`) REFERENCES Sprache(`ID`);
#3 楼
简单步骤...ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name)
#4 楼
检查此链接。它帮助我解决了errno 150:http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/
在我脑海中浮现出两件事。
您的外键索引在整个数据库中是否是唯一名称(列表中的第3个)?
您是否要在更新时将表PK设置为NULL(列表中的第5个)?今天,他们经常倒退……)。
编辑:我错过了您原始帖子的评论。 Unsigned / not unsigned int列可能会解决您的情况。希望我的链接对以后的想法有所帮助。
#5 楼
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;
但是您的表具有:
CREATE TABLE `katalog` (
`Sprache` int(11) NOT NULL,
由于定义为NOT NULL,因此无法将列Sprache设置为NULL。 >
#6 楼
如何修复Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) in mysql.
修改表并向其中添加索引。.
ALTER TABLE users ADD INDEX index_name (index_column)
现在添加约束
ALTER TABLE foreign_key_table
ADD CONSTRAINT foreign_key_name FOREIGN KEY (foreign_key_column)
REFERENCES primary_key_table (primary_key_column) ON DELETE NO ACTION
ON UPDATE CASCADE;
请注意,如果不添加索引,它将不起作用。
与它搏斗大约6个小时后,我想出了解决方案
希望这能拯救一个灵魂。
#7 楼
MySQL将执行以下查询:ALTER TABLE `db`.`table1`
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL,
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC),
ADD CONSTRAINT `col_table2_fk1`
FOREIGN KEY (`col_table2_fk`)
REFERENCES `db`.`table2` (`table2_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
干杯!
#8 楼
使用ALTER TABLE向表中添加外键约束时,请记住首先创建所需的索引。创建索引
Alter table
评论
我为两者创建了索引。当我尝试运行时,出现与以前相同的错误消息。当我拒绝“更新时删除”部分时,它可以工作,但是执行“删除时错误”操作;)
– frgtv10
2012年4月5日12:32
@ frgtv10最有可能与“删除时”表数据冲突。
–马克斯姆·波什查(Maksym Polshcha)
2012年4月5日12:43
#9 楼
一次查询全部尝试 ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0,
ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id);
#10 楼
步骤1:运行此脚本SET FOREIGN_KEY_CHECKS=0;
步骤2:添加列
ALTER TABLE mileage_unit ADD COLUMN COMPANY_ID BIGINT(20) NOT NULL
步骤3:添加外部添加列的键
ALTER TABLE mileage_unit
ADD FOREIGN KEY (COMPANY_ID) REFERENCES company_mst(COMPANY_ID);
步骤4:运行此脚本
SET FOREIGN_KEY_CHECKS=1;
#11 楼
这基本上是因为您的表位于两个不同的字符集中。例如,在charset = utf-8中创建的一个表和在CHARSET = latin1中创建的其他表,因此您希望能够向这些表添加foriegn键。在两个表中使用相同的字符集,则可以添加外键。错误1005 foriegn键约束格式不正确可以解决此问题#12 楼
我遇到了同样的问题。我的情况是该表已经有数据,并且该表中的键在引用表中不存在。因此,我不得不删除不遵守约束的行,并且一切正常。#13 楼
ALTER TABLE TABLENAME ADD FOREIGN KEY (Column Name) REFERENCES TableName(column name)
示例:-
ALTER TABLE Department ADD FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId)
评论
请在您的代码中添加一些解释,以便其他人可以从中学习
– Nico Haase
19年7月11日在13:06
评论
由于您没有发布SHOW CREATE TABLE的输出,所以我只能问-列名是否真的是ID,大写?好吧,现在更容易发现-katalog具有int(11)unsigned。 sprache没有未分配的部分,因此两列不相同。
您是说两个主要字段都必须是相同的数据类型吗?
这是您设计的问题:首先,您要引用两个不好的auto_increment列。另外,MySQL手册说:外键和引用键中的对应列在InnoDB内部必须具有相似的内部数据类型,以便可以在不进行类型转换的情况下进行比较。整数类型的大小和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。因此,是的,数据类型相似且符号相同。
我没有引用两个auto_increment字段。 katalog.Sprache(非自动)-> sprache.ID(自动)