刚刚在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>
UPDATE:多次删除并重新创建数据库后,在上述失败的插入操作之后我做了一个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!
UPDATE 2:事实证明,这只是MySQL中的massive错误。显然,最新版本的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秒)我重新创建了表,一切正常。
不足为奇的恕我直言。我发现MySQL中有许多错误。例如,使用where子句(例如“ WHERE some_tinyint_column = 0”)运行查询将在该情况下不产生任何数据,但是将子句重写为“ WHERE(NOT some_tinyint_column = 1)”会产生结果。经过一番研究,我发现这是一个应该修复的错误,但是在我使用的发行版中,该错误仍然存在。
结论:当MySQL中绝对没有任何意义的时候,我通常可以放心地假设它是一个错误并开始研究那些信息。
检查Language_Phrases (Language_Id)
和Language
(Id
)的数值类型属性
两者都应为未签名的填充或签名
* mysql>插入到语言短语(Language_Id,标签,短语)值(1,“ exampleLabel”,“某些短语”);错误1452(23000):无法添加或更新子行:... *
您正尝试插入1作为Language_Id,但是表Language具有属性AUTO_INCREMENT = 3。在这种情况下,您应该使用3或更高。
我今天有同样的错误。就我而言,我使用脚本来重新创建一些带有所有记录的表。
实际上,我已经意识到我的表之间的“ Engine”类型是不同的:一个是MyISAM,第二个是FK的引用(InnoDB)。我已经将所有表更改为InnoDB,现在一切正常。
此脚本将生成更新脚本文件(Reference)
mysql -u DB_USER -pDB_PASSWORD --default-character-set=utf8 DATABASE_NAME -e "SELECT CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;') AS sql_statements FROM information_schema.tables AS tb WHERE table_schema = database() AND ENGINE = 'MyISAM' AND TABLE_TYPE = 'BASE TABLE' ORDER BY table_name DESC;" > ./alter_InnoDb.sql
您必须删除“ alter_InnoDb.sql”中的第一行,该行包含文本“ sql_statements”。
之后,您可以在数据库中执行脚本来更正此错误:
mysql -u DB_USER -pDB_PASSWORD --default-character-set=utf8 DATABASE_NAME < ./ alter_InnoDb.sql
我也面临着同样的问题,没有找到解决我问题的解决方案。因此,由于许多原因,可能会发生此问题。我只是想将所有这些原因和解决方案放在一个地方,同时还要提供有助于解决此问题的解决方案。我希望这会对以后的人有所帮助。
1]由Penfold提供-表名区分大小写2)父子表中的引擎不匹配3)父子表中的字符集不匹配4)Parent(Id)和Child(Patent_Id:两者都必须具有完全相同的数据类型(也签名/未签名)5)InnoDB丢失了表,但是表存在-Please find solution here
SQL查询(显示引擎InnoDB状态)给出此错误(其.ibd文件当前不存在!)Blockquote
6)很少有较早版本的mysql有此错误。Bug#60196,Bug#603097)这对我有用(如果上面的一切似乎还不错,您可能需要这样做)-从子表中删除外键并再次添加约束。如果它也失败,则删除父表并再次创建它,在此之前,您需要从所有子表中删除外键。这是最后一件事。进一步阅读:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_lower_case_table_names