Recibí este error cuando intentaba modificar mi tabla.
Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food'
Aquí está mi DECLARACIÓN DE CREAR TABLA que se ejecutó correctamente.
CREATE TABLE favorite_food(
person_id SMALLINT UNSIGNED,
food VARCHAR(20),
CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id)
);
Luego intenté ejecutar esta declaración y obtuve el error anterior.
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
Respuestas:
El tipo y la definición del campo de clave externa y la referencia deben ser iguales. Esto significa que su clave externa no permite cambiar el tipo de su campo.
Una solución sería esta:
Ahora puedes cambiar tu person_id
recrear la clave externa
EDITAR: bloqueos agregados arriba, gracias a los comentarios
Agregué un bloqueo de escritura arriba
Todas las consultas de escritura en cualquier otra sesión que no sea la suya (
INSERT, UPDATE, DELETE
) esperarán hasta el tiempo de espera oUNLOCK TABLES
; es ejecutadohttp://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
EDICIÓN 2: OP pidió una explicación más detallada de la línea "El tipo y la definición del campo de clave externa y la referencia deben ser iguales. Esto significa que su clave externa no permite cambiar el tipo de su campo".
De MySQL 5.5 Reference Manual: FOREIGN KEY Restricciones
fuente
person_id
justo después de soltar la clave externa? Parece que no cambiaste nada porque ya es unSMALLINT UNSIGNED
.Puede desactivar las comprobaciones de claves externas:
Asegúrese de NO usar esto en producción y tener una copia de seguridad.
fuente
SET FOREIGN_KEY_CHECKS
está en el ámbito de la sesión (otras sesiones aún tendrán la restricción FK aplicada). Es perfecto para agregar / eliminarAUTO_INCREMENT
(lo que no cambia el tipo de datos de la columna real), pero no funcionará si intenta cambiar el tipo de datos de la columna por "real" (por ejemplo, de SMALLINT a INT), ya que obtendrá un legítimo150 FK constraint incorrectly formed
cuando mysql intenta reemplazar la tabla anterior por la nueva. En tal caso, utilice la respuesta aceptada.Cuando configura claves (primarias o externas), establece restricciones sobre cómo se pueden usar, lo que a su vez limita lo que puede hacer con ellas. Si realmente desea modificar la columna, puede volver a crear la tabla sin las restricciones, aunque no lo recomiendo. En términos generales, si tiene una situación en la que desea hacer algo, pero está bloqueada por una restricción, es mejor resolverla cambiando lo que desea hacer en lugar de la restricción.
fuente