¿Cómo eliminar restricciones de mi tabla MySQL?

252

Quiero eliminar restricciones de mi tabla. Mi consulta es:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

Pero recibí un error:

#1064- Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para obtener la sintaxis correcta para usar cerca de 'restricción FK_tbl_magazine_issue_mst_users' en la línea 1

deepu sankar
fuente
1
Vale la pena señalar que si creó una CHECKrestricción, no hay necesidad de eliminarla porque no se crea una restricción real. Puede seleccionar information_schema.table_constraintspara verificar, e incluso puede ejecutar add constraintuna y otra vez sin ningún error. MySQL no admite CHECKrestricciones, pero permite que el SQL tenga la intención de crearlas (sin crear las restricciones).
ADTC
Posible duplicado de Eliminar clave principal en MySQL
劉鎮 瑲
Su sintaxis es perfectamente válida y ahora es compatible con la demostración
Lukasz Szozda

Respuestas:

423

Mysql tiene una sintaxis especial para eliminar restricciones de clave externa:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users
Bohemio
fuente
21
Postgres, MSSQL y Oracle tienen todos alter table .. drop constraint. MySQL es el extraño, parece.
Jared Beck
Dice que no puede soltar las señales "column2" que se necesitan en una restricción de clave externa. Cuando hago lo que dices me sale "Cant DROP column2; comprueba que la columna / clave existe"
Lealo
Está bien, lo entiendo, lo extraño es algo separado simplemente conectando la columna a otras columnas de tablas. El mío tenía un nombre estándar dado. También ahora, ahora que se puede soltar las claves externas safetely sin la propia columna se cayó
read
1
La solución de Wellington Lorindo podría verse como más correcta, porque simplemente eliminando la clave externa no eliminará el índice relacionado. Por supuesto, el índice puede haberse creado por separado, pero si se creó como consecuencia de agregar la clave foránea en primer lugar, entonces no se eliminará simplemente soltando la clave foránea.
Rich Harding
55

Tuve el mismo problema y tuve que resolver con este código:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;
Wellington Lorindo
fuente
2
Esto podría verse como más correcto que la solución aceptada, porque simplemente eliminar la clave externa no eliminará el índice. Por supuesto, el índice puede haberse creado por separado, pero si se creó como consecuencia de agregar la clave foránea en primer lugar, entonces no se eliminará simplemente soltando la clave foránea.
Rich Harding
3
Como un solo comando: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte
26

No existe tal cosa como DROP CONSTRAINTen MySQL. En su caso, podría usar DROP FOREIGN KEYen su lugar.

Lothar
fuente
12

Si la restricción no es una clave externa, por ejemplo. uno agregado usando 'RESTRICCIÓN ÚNICA (colA, colB)' entonces es un índice que puede eliminarse usandoALTER TABLE ... DROP INDEX ...

Robert Knight
fuente
9

También es bueno, puede deshabilitar temporalmente todas las comprobaciones de clave externa de una base de datos mysql: SET FOREIGN_KEY_CHECKS=0; y habilitarlo nuevamente: SET FOREIGN_KEY_CHECKS=1;

Roelleor
fuente
8

Para agregar un poco a la respuesta de Robert Knight, ya que el título de la publicación en sí no menciona claves externas (y la suya no tiene ejemplos de código completos y dado que los bloques de código de comentarios de SO no se muestran tan bien como el código de las respuestas bloques), agregaré esto para restricciones únicas . Cualquiera de estos funciona para eliminar la restricción:

ALTER TABLE `table_name` DROP KEY `uc_name`;

o

ALTER TABLE `table_name` DROP INDEX `uc_name`;
jbobbins
fuente
4

Algunos ORM o marcos utilizan una convención de nomenclatura diferente para las claves externas que la predeterminada FK_[parent table]_[referenced table]_[referencing field] , porque pueden modificarse.

Laravel, por ejemplo, se utiliza [parent table]_[referencing field]_foreigncomo convención de nomenclatura. Puede mostrar los nombres de las claves externas utilizando esta consulta, como se muestra aquí :

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_SCHEMA = '<database>' AND REFERENCED_TABLE_NAME = '<table>';

Luego, elimine la clave externa ejecutando la consulta DROP FOREIGN KEY antes mencionada y su nombre propio.

piscator
fuente
2

Para aquellos que vienen aquí usando MariaDB:

Tenga en cuenta que MariaDB permite sentencias DROP CONSTRAINT en general, por ejemplo, para descartar restricciones de verificación:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

https://mariadb.com/kb/en/library/alter-table/

Markus Barthlen
fuente
Sí, esto es para restricciones que están dentro de la misma tabla, por ejemplo CONSTRAINT CHECK(a > b). Para restricciones de clave externa, parece que todavía necesita la DROP FOREIGN KEYsintaxis, al menos en MariaDB versión 10.2
Frank Forte
1
  1. Ir a la vista de estructura de la tabla
  2. Verá 2 opciones en la parte superior a. Estructura de la tabla b. Vista de relación .
  3. Ahora haga clic en la vista Relación , aquí puede soltar la restricción de clave externa. Obtendrá toda la relación aquí.
Akshay Sharma
fuente
Eso es genial, funcionó para mí cuando no conoces la identificación
Silviu St
0

No hay DROP CONSTRAINTen MySql. Esto funciona como magia en mysql 5.7

ALTER TABLE answer DROP KEY const_name;
Youness HARDI
fuente
0

La forma más sencilla de eliminar la restricción es usar la sintaxis ALTER TABLE tbl_name DROP CONSTRAINT symbol;introducida en MySQL 8.0.19 :

A partir de MySQL 8.0.19, ALTER TABLE permite una sintaxis más general (y estándar SQL) para eliminar y modificar las restricciones existentes de cualquier tipo, donde el tipo de restricción se determina a partir del nombre de la restricción

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

demostración de violín db <>

Lukasz Szozda
fuente
-4

esto funcionará en MySQL para eliminar restricciones

alter table tablename drop primary key;

alter table tablename drop foreign key;
Ranjitha
fuente
DROP PRIMARY KEYNo debería funcionar. DROP FOREIGN KEYfunciona pero necesita especificar a quién drop. Por ejemploALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre