¿Qué significa mysql error 1025 (HY000): error al cambiar el nombre de './foo' (errorno: 150)?

160

Intenté esto en mysql:

mysql> alter table region drop column country_id;

Y tengo esto:

ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)

¿Algunas ideas? Cosas clave extranjera?

Trenton
fuente
@skiphoppy - ¿Estás tratando de dar una recompensa por una respuesta ya dada? ¿Eso está permitido? ¿O es su caso diferente, en cuyo caso debe comenzar otro hilo?
Rick James el
@ RickJames Sí, lo es. Sin embargo, skiphoppy debería agregar su comentario debajo de la respuesta que eligió, ya que el mensaje de bouty desaparecerá cuando termine la recompensa.
RandomSeed

Respuestas:

240

Generalmente obtiene este error si sus tablas usan el motor InnoDB. En ese caso, tendría que soltar la clave externa, y luego hacer la tabla alter y soltar la columna.

Pero la parte difícil es que no puede soltar la clave externa usando el nombre de la columna, sino que debe encontrar el nombre utilizado para indexarla. Para encontrar eso, emita la siguiente selección:

MOSTRAR CREAR TABLA región;

Esto debería mostrar el nombre del índice, algo como esto:

RESTRICCIÓN region_ibfk_1FOREIGN KEY ( country_id) Referencias country( id) ON DELETE NO ACTION ON UPDATE NO ACTION

Ahora simplemente emita un:

alterar la región de la tabla soltar clave foránea region_ibfk_1;

Y finalmente un:

alter table region drop column country_id;

¡Y estás listo para irte!

Jeshurun
fuente
Tenga en cuenta que también puede soltar la clave externa y la columna en una consulta ALTER TABLE;
Valentin Grégoire
¡bonito! Deberíamos soltar la clave foránea, ¡todo estará bien! ¡Gracias!
Luan D
173

De hecho, es un error de clave externa, puede descubrirlo usando perror:

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

Para obtener más detalles sobre lo que falló, puede usar SHOW ENGINE INNODB STATUSy buscar la sección ÚLTIMO ERROR DE CLAVE EXTRANJERA que contiene detalles sobre lo que está mal.

En su caso, lo más probable es que algo esté haciendo referencia a la columna country_id.

Harrison Fisk
fuente
2
De nuevo, otro error engañoso de MySQL mostró ... Gracias.
e2-e4
En phpMyAdmin, puede encontrar el estado del motor en Storage Engines , InnoDB , InnoDB Status
Maxence
15

También puede obtener este error al intentar descartar una clave externa no existente. Por lo tanto, al soltar claves foráneas, asegúrese siempre de que realmente existan.

Si la clave externa existe, y aún recibe este error, intente lo siguiente:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

// ¡Suelta la clave foránea aquí!

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Esto siempre hace el truco para mí :)

Jeroen
fuente
1
Necesitaba esto mientras cambiaba a un conjunto de caracteres diferente de una tabla, debido a un error de mysql: ERROR 1025 (HY000): Error al cambiar el nombre de './table/#sql-14ae_81' a (errno: 150)
letsjump
7

Simplemente ejecute la consulta alter table usando 'KEY' en lugar de 'FOREIGN KEY' en la instrucción drop. Espero que ayude a resolver el problema, elimine la restricción de clave externa y pueda cambiar las columnas de la tabla y descartar la tabla.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

aquí en DROP KEYvez de DROP FOREIGN KEY,

Espero que ayude.

Gracias

Muhammad Sohail
fuente
4

Lo sé, esta es una publicación antigua, pero es el primer éxito en el motor de búsqueda favorito de todos si está buscando el error 1025.

Sin embargo, hay un "truco" fácil para solucionar este problema:

Antes de ejecutar su (s) comando (s), primero debe deshabilitar la verificación de restricciones de clave externa utilizando este comando:

SET FOREIGN_KEY_CHECKS = 0;

Entonces puede ejecutar su (s) comando (s).

Una vez que haya terminado, no olvide habilitar la comprobación de restricciones de clave externa nuevamente, utilizando este comando:

SET FOREIGN_KEY_CHECKS = 1;

Buena suerte con su esfuerzo.

Baccata
fuente
Estaba teniendo problemas para instalar octobercms en xampp, finalmente esto ayudó.
jahackbeth
2

Tuve problemas similares una vez. Eliminé la clave principal de la TABLA A, pero cuando estaba tratando de eliminar la columna de clave externa de la tabla BI se mostró el mismo error anterior.

No puede soltar la clave externa utilizando el nombre de la columna y para evitar esto en PHPMyAdmin o con MySQL, primero elimine la restricción de clave externa antes de renombrar o eliminar el atributo.

Joomler
fuente
1

Eche un vistazo en el archivo de error para su base de datos mysql. De acuerdo con el Bug # 26305, mi sql no le da la causa. Este error existe desde MySQL 4.1 ;-)

marabol
fuente
Encontré algunas de sus respuestas difíciles de seguir, pero +1 por vincular a un informe de error. Aparentemente, ahora se ha solucionado en MySQL v5.6.6. :)
mwfearnley
1

Si está utilizando un cliente como MySQL Workbench, haga clic con el botón derecho en la tabla deseada de donde se eliminará una clave externa, luego seleccione la pestaña de clave externa y elimine los índices.

Luego puede ejecutar la consulta de esta manera:

alter table table_name drop foreign_key_col_name;
iltaf khalid
fuente
1

Probablemente haya otra tabla con una clave externa que haga referencia a la clave primaria que está intentando cambiar.

Para averiguar qué tabla causó el error, puede ejecutar SHOW ENGINE INNODB STATUSy luego mirar la LATEST FOREIGN KEY ERRORsección

Use las categorías SHOW CREATE TABLE para mostrar el nombre de la restricción.

Lo más probable es que sea categories_ibfk_1

Use el nombre para soltar la clave externa primero y luego la columna:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;
youngdero
fuente
1

Haciendo

SET FOREIGN_KEY_CHECKS=0;

antes de que la Operación también pueda hacer el truco.

Jan Tchärmän
fuente
0

Supongo que el problema de restricción de clave externa. ¿Se utiliza country_id como clave foránea en otra tabla?

No soy DB Guru, pero creo que resolví un problema como este (donde había una restricción fk) quitando el fk, haciendo mis cosas de la tabla alternativa y luego rehaciendo las cosas fk.

Me interesará saber cuál es el resultado: a veces mysql es bastante críptico.

itsmatt
fuente
Mysql puede ser horrible. Bueno por lo general, pero esos mensajes de error, sheesh. Si recibimos una explicación concisa de alguien en la oficina, la arrojaré aquí.
Trenton
0

En mi caso, estaba usando MySQL workbench y me enfrenté al mismo problema al soltar una de mis columnas en una tabla. No pude encontrar el nombre de la clave externa. Seguí los siguientes pasos para resolver el problema:

  1. Rt. haga clic en su esquema y seleccione 'inspector de esquema'. Esto le da varias tablas, columnas, índices, etc.

  2. Vaya a la pestaña llamada 'Índices' y busque el nombre de la columna debajo de la columna llamada 'Columna'. Una vez encontrado, verifique el nombre de la tabla para este registro bajo el nombre de la columna 'Tabla'. Si coincide con el nombre de la tabla que desea, anote el nombre de la clave externa de la columna llamada 'Nombre'.

  3. Ahora ejecute la consulta: ALTER table tableNamexx DROP KEY foreignKeyName;

  4. Ahora puede ejecutar la instrucción drop que se ejecutará con éxito

Jatin Shashoo
fuente
0

Recibí este error con MySQL 5.6 pero no tenía nada que ver con las claves externas. Esto estaba en una máquina con Windows 7 Professional que actuaba como un servidor en una LAN pequeña.

La aplicación cliente estaba realizando una operación por lotes que crea una tabla que la llena con algunos datos externos, luego ejecuta una consulta que se une con tablas permanentes y luego suelta la tabla "temporal". Este lote hace esto aproximadamente 300 veces y esta rutina en particular se había estado ejecutando semana tras semana durante varios años cuando de repente recibimos el Error 1025 No se puede cambiar el nombre del problema en un punto aleatorio del lote.

En mi caso, la aplicación estaba usando 4 declaraciones DDL, una CREATE TABLE seguida de 3 CREATE INDEX, no hay una clave foránea. Sin embargo, solo se crearon 2 de los índices y se cambió el nombre del archivo .frm de la tabla real, en el punto de falla.

Mi solución fue deshacerme de las declaraciones CREATE INDEX separadas y crearlas usando la declaración CREATE TABLE. Esto en el momento de escribir esto ha resuelto el problema para mí y para ayudar a alguien más a rascarse la cabeza cuando encuentran este hilo.

Chris Millard
fuente
-2

averageRatings = FOREACH groupedRatings GENERATE group AS movieID, AVG (ratings.rating) AS avgRating, COUNT (ratings.rating) AS numRatings;

Si está utilizando algún comando como el anterior, debe usar group en minúsculas. Esto puede resolver su problema, resolvió el mío. Al menos en script PIG.

Naman Dhameja
fuente
No creo que esto esté relacionado con el problema, él o ella está teniendo problemas con MySQL
Zdenek Machek