当前位置: 首页 > 面试题库 >

存在外键时,MySQL 5.5外键约束失败

夏新翰
2023-03-14
问题内容

刚在Mac OS X 10.6上安装了MySQL
5.5,并且在许多表上都有一个奇怪的问题。下面是一个例子。插入行失败,但不应插入外键约束。它引用的外键确实存在。有任何想法吗?

mysql> show create table Language;
+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Language | CREATE TABLE `Language` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Code` varchar(2) NOT NULL,
  `Name` varchar(63) CHARACTER SET utf8 DEFAULT NULL,
  `Variant` varchar(63) CHARACTER SET utf8 DEFAULT NULL,
  `Country_Id` int(11) DEFAULT NULL,
  PRIMARY KEY (`Id`),
  UNIQUE KEY `Code` (`Code`,`Country_Id`,`Variant`),
  KEY `FKA3ACF7789C1796EB` (`Country_Id`),
  CONSTRAINT `FKA3ACF7789C1796EB` FOREIGN KEY (`Country_Id`) REFERENCES `Country` (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 |
+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create table Language_Phrases;
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table            | Create Table                                                                                                                                                                                                                                                                                                                                                    |
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Language_Phrases | CREATE TABLE `Language_Phrases` (
  `Language_Id` int(11) NOT NULL,
  `Phrase` varchar(255) DEFAULT NULL,
  `Label` varchar(255) NOT NULL,
  PRIMARY KEY (`Language_Id`,`Label`),
  KEY `FK8B4876F3AEC1DBE9` (`Language_Id`),
  CONSTRAINT `FK8B4876F3AEC1DBE9` FOREIGN KEY (`Language_Id`) REFERENCES `Language` (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from Language;
+----+------+----------+---------+------------+
| Id | Code | Name     | Variant | Country_Id |
+----+------+----------+---------+------------+
|  1 | en   | English  |         |        235 |
|  2 | ro   | Romanian |         |        181 |
+----+------+----------+---------+------------+
2 rows in set (0.00 sec)

mysql> select * from Language_Phrases;
Empty set (0.00 sec)

mysql> INSERT INTO Language_Phrases (Language_Id, Label, Phrase) VALUES (1, 'exampleLabel', 'Some phrase');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`dev`.`language_phrases`, CONSTRAINT `FK8B4876F3AEC1DBE9` FOREIGN KEY (`Language_Id`) REFERENCES `Language` (`Id`))
mysql>

更新 :多次删除并重新创建数据show engine innodb status后,我在上述插入失败后进行了操作,并得到了令人惊讶的结果。找不到父语言表!这似乎很奇怪…有什么想法吗?

------------------------
LATEST FOREIGN KEY ERROR
------------------------
110406  9:55:49 Transaction:
TRANSACTION CA3B, ACTIVE 0 sec, OS thread id 4494462976 inserting
mysql tables in use 1, locked 1
1 lock struct(s), heap size 376, 0 row lock(s)
MySQL thread id 25, query id 50720 localhost root update
INSERT INTO Language_Phrases (Language_Id, Label, Phrase) VALUES (1, 'exampleLabel', 'Some phrase')
Foreign key constraint fails for table `dev`.`language_phrases`:
,
  CONSTRAINT `FK8B4876F3AEC1DBE9` FOREIGN KEY (`Language_Id`) REFERENCES `Language` (`Id`)
Trying to add to index `PRIMARY` tuple:
DATA TUPLE: 5 fields;
 0: len 4; hex 80000001; asc     ;;
 1: len 17; hex 747970654d69736d617463682e79656172; asc exampleLabel;;
 2: len 6; hex 00000000ca3b; asc      ;;;
 3: len 7; hex 00000000000000; asc        ;;
 4: len 21; hex 59656172206d7573742062652061206e756d626572; asc Some phrase;;

But the parent table `dev`.`Language`
or its .ibd file does not currently exist!

更新2 :事实证明,这只是MySQL中的一个 巨大 错误。显然,最新版本的MySQL无法在mac os X
10.6下完全运行(也许也可以是早期版本?)。降级至5.5.8似乎可行。非常令人惊讶。


问题答案:

这似乎是自Mac OS X上的MySQL
5.5.9起引入的错误:http
://bugs.mysql.com/bug.php?id=60309

它在5.5.13(5月31日发布)中被标记为已修复,并在发行说明中提到:http
:
//dev.mysql.com/doc/refman/5.5/en/news-5-5-13.html

另外,在错误报告中列出了一种解决方法,我已在5.5.10上对此进行了验证,并复制如下:

[3 Mar 20:29] Harald Neiss

我还收到了一个新的MBP并重新安装了MySQL(mysql-5.5.10-osx10.6-x86_64)。最后我
遇到了与上述相同的问题。所以这是查询结果以及我
确实解决了。

mysql>显示类似“ lower%”的变量;
+ ------------------------ + ------- +
| 变量名| 价值|
+ ------------------------ + ------- +
| lower_case_file_system | 开|
| lower_case_table_names | 2 |
+ ------------------------ + ------- +
设置2行(0.00秒)

删除数据库,创建文件/etc/my.cnf,其内容如下:

[mysqld]
lower_case_table_names = 1

重新启动MySQL守护程序并重复查询:

mysql>显示类似“ lower%”的变量;
+ ------------------------ + ------- +
| 变量名| 价值|
+ ------------------------ + ------- +
| lower_case_file_system | 开|
| lower_case_table_names | 1 |
+ ------------------------ + ------- +
设置2行(0.00秒)

我重新创建了表,一切正常。


 类似资料:
  • 问题内容: 我收到此错误消息: 第40行的错误1217(23000):无法删除或更新父行:外键约束失败 …当我尝试放置桌子时: …定义如下: 有趣的是, 我已经删除 了模式中具有外键的 所有其他表。实际上,除了表外,数据库是空的。 如果数据库中没有其他对象,怎么可能会有子行?据我所知,InnoDB不允许在其他模式上使用外键,对吗? (我什至可以运行命令:-?) 问题答案: 两种可能性: 在另一个架

  • 嗨,我知道有人问过这个问题,但我还没有找到正确的答案,为什么当我尝试做我的第二个插入: 我得到了错误: 错误1452(23000):无法添加或更新子行:外键约束失败(.,约束外键()引用()) 下面的DDL代码:

  • mysql 5.7 外键约束 主表:部门表 从表:员工表 添加外键:从表 dep_id 关联 主表 id >[danger] CASCADE > 级联更新 主表数据更新从表会更新外键 级联删除 主表数据删除,从表会一起删除

  • 主要内容:在创建表时设置外键约束,在修改表时添加外键约束,删除外键约束MySQL外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。 外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西

  • 注意 当前章节中涉及的配置一般适用于关系数据库。这里展示的扩展方法在你安装了关系数据库提供程序之后就能获得(由Microsoft.EntityFrmeworkCore.Relational 程序包共享)。 外键约束是为模型中的关系引入的。 惯例 按照惯例,外键约束命名为 FK_<依赖实体类型名称>_<主实体类型名称>_<外键属性名称>。对于组合键,<外键属性名> 则为用下划线分隔的外键属性名。 数

  • 我正在做一个基本的例子来测试级联删除操作,但我得到了异常。这是我的实体