8

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 へのダウングレードは機能しているようです。非常に驚くべきことです。

4

6 に答える 6

9

これは、Mac OS X の MySQL 5.5.9 以降に導入されたバグのようです: http://bugs.mysql.com/bug.php?id=60309

これは 5.5.13 (5 月 31 日リリース) で修正済みとしてマークされ、リリース ノートに記載されています

または、5.5.10 で確認し、以下に再現したバグ レポートに記載されている回避策があります。

[3月20日 11:29] ハラルド・ナイス

また、新しい 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 秒)

テーブルを再作成したところ、すべて正常に動作しました。

于 2011-06-07T07:32:44.897 に答える
1

当然のことながら私見。MySQLに多数のバグを見つけました。たとえば、「WHERE some_tinyint_column = 0」などのwhere句を使用してクエリを実行すると、必要なときにデータが生成されませんが、句を「WHERE(NOT some_tinyint_column = 1)」に書き換えると結果が生成されます。調査の結果、修正されたはずのバグであることがわかりましたが、使用していたリリースでは、バグはまだ残っていました。

結論:MySQLで何かがまったく意味をなさない場合、私は通常、それがバグであると想定し、それらの線に沿って情報の調査を開始するのが安全だと思います。

于 2013-02-01T19:21:55.730 に答える
1

私も同じ問題に直面しており、問題を解決する解決策が見つかりませんでした。そのため、この問題はさまざまな理由で発生する可能性があります。これらの理由と解決策をできるだけ多く 1 か所にまとめ、これを解決するのに役立つ修正を加えようとしています。これが将来誰かに役立つことを願っています。

1) Penfold提供- テーブル名の大文字と小文字の区別
2) 親テーブルと子テーブルのエンジンの不一致
3) 親テーブルと子テーブルの文字セットの不一致
4) 親 (Id) と子 (Patent_Id : 両方ともまったく同じデータ型 (また署名済み) である必要があります/Unsigned)
5) InnoDB でテーブルが失われましたが、テーブルは存在します -ここで解決策を見つけてください

SQL クエリ (エンジンの InnoDB ステータスを表示) でこのエラーが発生する (その .ibd ファイルは現在存在しません!)

6) mysql のいくつかの古いバージョンには、このバグがあります。バグ #60196バグ #60309
7) これは私にとってはうまくいきます (上記のすべてが問題ないように思われる場合は、おそらくこれが必要です)。子テーブルから外部キーを削除し、再度制約を追加します。それでも失敗する場合は、親テーブルを削除して再度作成します。その前に、すべての子テーブルから外部キーを削除する必要があります。これは最後の可能なことです。
さらに読む:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_lower_case_table_names

于 2020-01-09T18:20:48.417 に答える
0

*mysql> INSERT INTO Language_Phrases (Language_Id, Label, Phrase) VALUES (1, 'exampleLabel', 'Some phrase'); エラー 1452 (23000): 子行を追加または更新できません:...*

Language_Id として1を挿入しようとしていますが、テーブル Language にはプロパティ AUTO_INCREMENT= 3があります。この場合、3 以上を使用する必要があります。

于 2011-04-07T11:53:30.753 に答える
0

Language_Phrases (Language_Id)Language( Id)の数値型属性を確認してください

両方ともUNSIGNED ZEROFILL または SIGNEDのいずれかである必要があります

于 2011-04-06T13:34:48.317 に答える