Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql外键约束格式不正确错误_Mysql_Sql_Heidisql - Fatal编程技术网

mysql外键约束格式不正确错误

mysql外键约束格式不正确错误,mysql,sql,heidisql,Mysql,Sql,Heidisql,我有两个表,table1是一个列为ID的父表,table2是一个列为IDFromTable1(不是实际名称)的父表,当我在table1中将FK放在IDFromTable1上时,我得到了一个错误外键约束格式错误。如果table1记录被删除,我想删除表2记录。谢谢你的帮助 ALTER TABLE `table2` ADD CONSTRAINT `FK1` FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`)

我有两个表,
table1
是一个列为
ID
的父表,
table2
是一个列为
IDFromTable1
(不是实际名称)的父表,当我在
table1
中将FK放在
IDFromTable1
上时,我得到了一个错误
外键约束格式错误
。如果
table1
记录被删除,我想删除表2记录。谢谢你的帮助

ALTER TABLE `table2`  
   ADD CONSTRAINT `FK1` 
      FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`) 
      ON UPDATE CASCADE 
      ON DELETE CASCADE;
如果需要任何其他信息,请告诉我。我是mysql新手

请尝试运行以下命令:

show create table Parent //and check if type for both tables are the same, like myISAM or innoDB, etc //Other aspects to check with this error message: the columns used as foreign keys must be indexed, they must be of the same type (if i.e one is of type smallint(5) and the other of type smallint(6), it won't work), and, if they are integers, they should be unsigned. //or check for charsets show variables like "character_set_database"; show variables like "collation_database"; //edited: try something like this ALTER TABLE table2 ADD CONSTRAINT fk_IdTable2 FOREIGN KEY (Table1_Id) REFERENCES Table1(Table1_Id) ON UPDATE CASCADE ON DELETE CASCADE;
CREATE TABLE `the_table` (
  `id` int(11) NOT NULL,            /* No PRIMARY KEY index */  
  `name` varchar(255) NOT NULL,
  `name_fa` varchar(255) NOT NULL,
  `name_pa` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

... /* SOME DATA DUMP OPERATION */

ALTER TABLE `the_table`
  ADD PRIMARY KEY (`id`), /* PRIMARY KEY INDEX */
  ADD UNIQUE KEY `uk_acu_donor_name` (`name`);
显示创建表父项 //并检查两个表的类型是否相同,如myISAM或innoDB等 //要检查此错误消息的其他方面:列用作外部 键必须被索引,它们必须是相同类型的 (如一个为smallint(5)型,另一个为smallint(6)型), 这将不起作用),并且,如果它们是整数,则应该是无符号的。 //或者检查字符集 显示变量,如“字符集数据库”; 显示变量,如“排序规则\数据库”; //编辑:试试这样 更改表2 添加约束fk_IdTable2 外键(表1_Id) 参考资料表1(表1\u Id) 关于更新级联 删除级联;
我在HeidiSQL中遇到了同样的问题。您收到的错误非常隐晦。我的问题是外键列和引用列的类型或长度不同


外键列为
SMALLINT(5)UNSIGNED
,引用列为
INT(10)UNSIGNED
。一旦我使它们都具有相同的确切类型,外键的创建工作就完美了。

定义外键的语法是非常宽容的,但是对于任何一个在这个问题上绊倒的人来说,外键必须是“同一类型”这一事实甚至适用于排序规则,而不仅仅是数据类型、长度和位签名

并不是说你会在你的模型中混合排序规则(你会吗?),但是如果你这样做的话,确保你的主键和外键字段在phpmyadmin或HeidiSQL或你使用的任何东西中都是相同的排序规则类型


希望这能为您节省四个小时的试错时间。

我对Laravel 5.1 migration Schema Builder和MariaDB 10.1也有同样的问题

问题是我在设置列时键入了
unigned
而不是
unsigned
(缺少
s
字母)


修复后,我的打字错误得到了修复。

当使用
MyISAM
引擎创建父表时,我也遇到了同样的问题。这是一个愚蠢的错误,我纠正了这个错误:

ALTER TABLE parent_table ENGINE=InnoDB;
只是为了完成

如果外键带有VARCHAR(..),并且引用的表的字符集与引用它的表不同,则也可能出现此错误


e、 g.拉丁1表中的VARCHAR(50)与UTF8表中的VARCHAR(50)不同。

我对Symfony 2.8也有同样的问题

一开始我没有得到它,因为外键的int长度等方面没有类似的问题

最后,我必须在项目文件夹中执行以下操作。(服务器重启没有帮助!)

app/console原则:缓存:清除元数据
应用程序/控制台原则:缓存:清除查询

应用程序/控制台原则:缓存:清除结果

如果一切正常,只需添加
->unsigned()
foregin键的末尾


如果不起作用,请检查两个字段的数据类型。它们必须是相同的。

确保列是相同的(类型相同),如果引用列不是
主键
,确保它是
索引的

mysql错误文本没有多大帮助,在我的情况下,列有“notnull”约束,所以“on delete set null”是不允许的

我也有同样的问题,但是解决了它

只需确保“table1”中的列“ID”具有唯一的索引


当然,这两个表中“ID”和“IDFromTable1”列的类型和长度必须相同。但是你已经知道了。我也有同样的问题

问题在于引用列不是主键

把它作为主键,问题就解决了。

谢谢S Doerin:

“只是为了完成。 如果外键带有VARCHAR(..),并且引用的表的字符集与引用它的表不同,则也可能出现此错误。 e、 g.拉丁1表中的VARCHAR(50)与UTF8表中的VARCHAR(50)不同。”

我解决了这个问题,更改了表的字符类型。 创建时使用拉丁文1,正确的是utf8

添加下一行。
默认字符集=utf8

我在使用Alter table在两个表之间添加外键时遇到问题,帮助我的是确保我尝试添加外键关系的每一列都被索引。要在PHP myAdmin中执行此操作,请执行以下操作: 转到表并单击“结构”选项卡。 单击索引选项为所需列编制索引,如屏幕截图所示:

一旦我用外键索引了我试图引用的两列,我就能够成功地使用alter表并创建外键关系。您将看到列的索引如下面的屏幕截图所示:


注意两个表中的邮政编码是如何显示的

您需要检查两者的所有属性是否相同,包括“排序规则”

尽管其他答案非常有用,但我也想分享一下我的经验

当我删除了一个表,该表的
id
已经在其他表(带有数据)中被引用为外键,并试图用一些附加列重新创建/导入该表时,我遇到了这个问题

娱乐查询(在phpMyAdmin中生成)如下所示:

show create table Parent //and check if type for both tables are the same, like myISAM or innoDB, etc //Other aspects to check with this error message: the columns used as foreign keys must be indexed, they must be of the same type (if i.e one is of type smallint(5) and the other of type smallint(6), it won't work), and, if they are integers, they should be unsigned. //or check for charsets show variables like "character_set_database"; show variables like "collation_database"; //edited: try something like this ALTER TABLE table2 ADD CONSTRAINT fk_IdTable2 FOREIGN KEY (Table1_Id) REFERENCES Table1(Table1_Id) ON UPDATE CASCADE ON DELETE CASCADE;
CREATE TABLE `the_table` (
  `id` int(11) NOT NULL,            /* No PRIMARY KEY index */  
  `name` varchar(255) NOT NULL,
  `name_fa` varchar(255) NOT NULL,
  `name_pa` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

... /* SOME DATA DUMP OPERATION */

ALTER TABLE `the_table`
  ADD PRIMARY KEY (`id`), /* PRIMARY KEY INDEX */
  ADD UNIQUE KEY `uk_acu_donor_name` (`name`);
您可能注意到,
主键
索引是在创建(和插入数据)之后设置的,这导致了问题

解决方案 索尔
SET FOREIGN_KEY_CHECKS=OFF;
ALTER TABLE ... ADD CONSTRAINT ...
SET FOREIGN_KEY_CHECKS=ON;
 CONSTRAINT `FK_PURCHASE_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
 CONSTRAINT `FK_PURCHASE_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `CUSTOMER` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
MariaDB [blog]> alter table t_user add FOREIGN KEY ( country_code ) REFERENCES t_country ( coutry_code );
ERROR 1005 (HY000): Can't create table `blog`.`t_user` (errno: 150 "Foreign key constraint is incorrectly formed")
MariaDB [blog]> alter table t_user add FOREIGN KEY ( country_code ) REFERENCES t_country ( country_code );
Query OK, 2 rows affected (0.039 sec)              
Records: 2  Duplicates: 0  Warnings: 0
database/migrations/2020_01_01_00001_create_table2_table.php
database/migrations/2020_01_01_00002_create_table1_table.php
database/migrations/2020_01_01_00001_create_table1_table.php
database/migrations/2020_01_01_00002_create_table2_table.php