Come rimuovere i vincoli dalla mia tabella MySQL?


260

Voglio rimuovere i vincoli dalla mia tabella. La mia domanda è:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

Ma ho ricevuto un errore:

#1064- Hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a 'vincolo FK_tbl_magazine_issue_mst_users' alla riga 1


1
Vale la pena notare che se si crea un CHECKvincolo, non è necessario eliminarlo perché non viene creato alcun vincolo effettivo. È possibile selezionare da information_schema.table_constraintsper verificare e persino eseguire add constraintripetutamente senza errori. MySQL non supporta i CHECKvincoli ma consente all'SQL di crearli (senza creare effettivamente i vincoli).
ADTC


Possibile duplicato di Rimuovi chiave primaria in MySQL
劉鎮 瑲

La tua sintassi è perfettamente valida e ora è supportata la demo
Lukasz Szozda il

Risposte:


431

Mysql ha una sintassi speciale per eliminare i vincoli di chiave esterna:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

23
Postgres, MSSQL e Oracle hanno tutti alter table .. drop constraint. MySQL è quello strano, a quanto pare.
Jared Beck

Dice che non può eliminare "colonna2" perché è necessario in un vincolo di chiave esterna. Quando faccio come dici tu ottengo "Cant DROP column2; controlla che la colonna / chiave esista"
Lealo

Va bene, ho capito, l'estraneo è una cosa separata che collega la colonna ad altre colonne della tabella. Il mio aveva un nome standard dato ad esso. Inoltre, ora posso rilasciare chiavi esterne in modo sicuro senza che la colonna stessa venga rilasciata
Lealo

1
La soluzione di Wellington Lorindo potrebbe essere vista come più corretta, perché la semplice rimozione della chiave esterna non rimuoverà l'indice correlato. Ovviamente l'indice potrebbe essere stato creato separatamente, ma se è stato creato come conseguenza dell'aggiunta della chiave esterna in primo luogo, non verrà rimosso semplicemente rilasciando la chiave esterna.
Rich Harding

56

Ho avuto lo stesso problema e ho avuto modo di risolverlo con questo codice:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;

2
Questo potrebbe essere visto come più corretto della soluzione accettata, perché la semplice rimozione della chiave esterna non rimuoverà l'indice. Ovviamente l'indice potrebbe essere stato creato separatamente, ma se è stato creato come conseguenza dell'aggiunta della chiave esterna in primo luogo, non verrà rimosso semplicemente rilasciando la chiave esterna.
Rich Harding

3
Come unico comando: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte

26

Non esiste qualcosa come DROP CONSTRAINTin MySQL. Nel tuo caso potresti usare DROP FOREIGN KEYinvece.


13

Se il vincolo non è una chiave esterna, ad es. uno aggiunto usando 'UNIQUE CONSTRAINT (colA, colB)' quindi è un indice che può essere eliminato usandoALTER TABLE ... DROP INDEX ...


9

Per aggiungere un po 'alla risposta di Robert Knight, dal momento che il titolo del post stesso non menziona le chiavi esterne (e poiché il suo non ha esempi di codice completi e poiché i blocchi di codice di commento di SO non vengono visualizzati così come il codice delle risposte blocchi), aggiungerò questo per vincoli univoci . Uno di questi lavori per eliminare il vincolo:

ALTER TABLE `table_name` DROP KEY `uc_name`;

o

ALTER TABLE `table_name` DROP INDEX `uc_name`;

9

Inoltre è bello, puoi disabilitare temporaneamente tutti i controlli delle chiavi esterne da un database mysql: SET FOREIGN_KEY_CHECKS=0; E per abilitarlo di nuovo: SET FOREIGN_KEY_CHECKS=1;


4

Alcuni ORM o framework utilizzano una convenzione di denominazione diversa per le chiavi esterne rispetto a quella predefinita FK_[parent table]_[referenced table]_[referencing field], poiché possono essere modificate.

Laravel, ad esempio, usa [parent table]_[referencing field]_foreigncome convenzione di denominazione. Puoi mostrare i nomi delle chiavi esterne usando questa query, come mostrato qui :

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

Quindi rimuovere la chiave esterna eseguendo la query DROP FOREIGN KEY sopra menzionata e il suo nome corretto.


2

Per quelli che vengono qui usando MariaDB:

Nota che MariaDB consente le istruzioni DROP CONSTRAINT in generale, ad esempio per eliminare i vincoli di controllo:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

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


Sì, questo è per i vincoli che sono all'interno della stessa tabella, ad esempio CONSTRAINT CHECK(a > b). Per i vincoli di chiave esterna, sembra che sia ancora necessaria la DROP FOREIGN KEYsintassi, almeno nella versione 10.2 di MariaDB
Frank Forte

1
  1. Vai alla visualizzazione della struttura della tabella
  2. Vedrai 2 opzioni in alto a. Struttura della tabella b. Vista delle relazioni .
  3. Ora fai clic su Visualizzazione relazione , qui puoi eliminare il vincolo di chiave esterna. Otterrai tutte le relazioni qui.

È fantastico, ha funzionato per me quando non conosci l'id
Silviu St

1

Il modo più semplice per rimuovere i vincoli è utilizzare la sintassi ALTER TABLE tbl_name DROP CONSTRAINT symbol;introdotta in MySQL 8.0.19 :

A partire da MySQL 8.0.19, ALTER TABLE consente una sintassi più generale (e standard SQL) per eliminare e modificare i vincoli esistenti di qualsiasi tipo, dove il tipo di vincolo è determinato dal nome del vincolo

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

db <> fiddle demo


0

Non c'è DROP CONSTRAINTIn MySql. Funziona come per magia in mysql 5.7

ALTER TABLE answer DROP KEY const_name;

-4

questo funzionerà su MySQL per eliminare i vincoli

alter table tablename drop primary key;

alter table tablename drop foreign key;

DROP PRIMARY KEYnon dovrebbe funzionare. DROP FOREIGN KEYfunziona ma è necessario specificare a chi drop. Ad esempioALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.