我想向名为“ 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没有未分配的部分,因此两列不相同。

您是说两个主要字段都必须是相同的数据类型吗?

这是您设计的问题:首先,您要引用两个不好的auto_increment列。另外,MySQL手册说:外键和引用键中的对应列在InnoDB内部必须具有相似的内部数据类型,以便可以在不进行类型转换的情况下进行比较。整数类型的大小和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。因此,是的,数据类型相似且符号相同。

我没有引用两个auto_increment字段。 katalog.Sprache(非自动)-> sprache.ID(自动)

#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