6

Acabo de instalar MySQL 5.5 en mac os x 10.6 y tengo un problema extraño en muchas tablas. A continuación hay un ejemplo. La inserción de una fila falla con una restricción de clave externa cuando no debería. La clave externa a la que hace referencia sí existe. ¿Algunas ideas?MySQL 5.5 restricción de clave externa falla cuando existe una clave externa

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> 

ACTUALIZACIÓN: Después de caer y volver a crear la base de datos varias veces, me hicieron un show engine innodb status después de la inserción en su defecto arriba y consiguió este resultado sorprendente. ¡La tabla de idiomas principal no se encuentra! Esto parece muy extraño ... alguna idea?

------------------------ 
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! 

ACTUALIZACIÓN 2: Resulta que esto es simplemente una masiva error en MySQL. Aparentemente, las últimas versiones de MySQL no funcionan completamente bajo mac os X 10.6 (¿quizás también versiones anteriores?). La degradación a 5.5.8 parece funcionar. Extremadamente sorprendente.

+1

¿Hay un enlace a donde se menciona este error? Estoy teniendo el mismo problema (mysql5.5 y osx10.6) y me gustaría leer más sobre él. –

+0

no tengo los enlaces a mano, los encontramos en los foros de MySQL y había un informe de error también. –

+0

Tenía exactamente el mismo problema, gracias por publicar este chicos. Esto ha estado volviendo loco durante los últimos días. –

Respuesta

8

Esto parece ser un error introducido desde MySQL 5.5.9 en Mac OS X: http://bugs.mysql.com/bug.php?id=60309

Está marcado como fijo en 5.5.13 (publicado 31 de mayo) y se menciona en las notas de la versión: http://dev.mysql.com/doc/refman/5.5/en/news-5-5-13.html

por otra parte, hay una solución que figuran en el informe de error que he verificado en 5.5.10 y se reproduce a continuación:

 

[20 Mar 11:29] Harald Neiss 

I also received a new MBP and reinstalled MySQL (mysql-5.5.10-osx10.6-x86_64). Finally I 
came across the same problem as described above. So here is the query result and what I 
did to solve it. 

mysql> show variables like 'lower%'; 
+------------------------+-------+ 
| Variable_name   | Value | 
+------------------------+-------+ 
| lower_case_file_system | ON | 
| lower_case_table_names | 2  | 
+------------------------+-------+ 
2 rows in set (0.00 sec) 

Dropped database, created the file /etc/my.cnf with the following content: 

[mysqld] 
lower_case_table_names=1 

Restarted the MySQL daemon and repeated the query: 

mysql> show variables like 'lower%'; 
+------------------------+-------+ 
| Variable_name   | Value | 
+------------------------+-------+ 
| lower_case_file_system | ON | 
| lower_case_table_names | 1  | 
+------------------------+-------+ 
2 rows in set (0.00 sec) 

I recreated the tables and everything works fine. 

+0

Gracias! ¡Comprobaré la última versión de mysql! –

+0

Este problema surgió nuevamente después de actualizar a OS X Lion. La solución que mencioné anteriormente no pareció funcionar esta vez, por lo que me vi obligado a actualizar MySQL. La versión 5.5.14 instalada a través de [homebrew] (https://github.com/mxcl/homebrew) funciona de maravilla. – penfold

0

verificación de los atributos de tipo numérico de Language_Phrases (Language_Id) y Language (Id)

both should be either UNSIGNED ZEROFILL or SIGNED

+0

¿cómo puedo comprobar o establecer si llevan la firma o sin firma? –

+0

ambos son 'int (11)' 'de acuerdo con describe' –

+0

ir a' phpmyadmin' y compruebe si hay both..may ser un poco de espacio en el nombre del atributo ?? – diEcho

0

* mysql> INSERT INTO Language_Phrases (LANGUAGE_ID, Etiqueta, Frase) VALORES (1, 'exampleLabel', 'Algunos frase'); ERROR 1452 (23000): No se puede añadir o actualizar una fila secundaria: ... *

Usted está intentando insertar como LANGUAGE_ID, pero tabla de idiomas tiene la propiedad AUTO_INCREMENT = . En este caso, debe usar 3 o más.

+0

me dio la salida de la Lengua, que incluye 2 filas (esa es la razón AUTO_INCREMENT = 3) –

+0

Trate de recrear el FK; no es el mismo error - http://forums.mysql.com/read.php?135,407929,407929#msg-407929 – Devart

+0

caer y volver a crear la clave externa no corregir el error. Pero hilo interesante Parece que las últimas 3 versiones de MySQL están bastante rotas, al menos en Mac OS X 10.6. Bajar la versión de MySQL 5.5.8 a funcionado para nosotros, así como el hilo ... –

1

No es mi humilde opinión sorprendente. He encontrado numerosos errores en MySQL. Por ejemplo, ejecutar consultas con cláusulas where como "WHERE some_tinyint_column = 0" no produciría datos cuando debería, pero reescribir la cláusula como "WHERE (NOT some_tinyint_column = 1)" produce resultados. Después de algunas investigaciones, descubrí que se trataba de un error que se suponía que había sido reparado, pero en el lanzamiento que estaba usando, el error todavía estaba allí.

Conclusión: cuando algo no tiene absolutamente ningún sentido en MySQL, generalmente me parece seguro asumir que es un error y comenzar a buscar información en ese sentido.

0

Tuve el mismo error hoy. En mi caso, he usado un script para recrear algunas tablas con todos sus registros.

De hecho, me he dado cuenta de que el tipo de "Motor" era diferente entre mis tablas: una era MyISAM y la segunda (la referencia de FK) era InnoDB. He alterado todas mis tablas para InnoDB y ahora todo funciona bien.

Este script generará un archivo de script de actualización (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 

Debe eliminar la primera línea en "alter_InnoDb.sql", línea que contiene el texto "SQL_statements".

Después de eso, se puede ejecutar la secuencia de comandos en su base de datos para corregir este error:

mysql -u DB_USER -pDB_PASSWORD --default-character-set=utf8 DATABASE_NAME < ./ alter_InnoDb.sql 
Cuestiones relacionadas