Come troncare una tabella vincasting con chiave esterna?

Perché non funziona TRUNCATE su mygroup ? Anche se ho ON DELETE CASCADE SET ottengo:

ERRORE 1701 (42000): imansible troncare una tabella a cui fa riferimento un vincolo di chiave esterna ( instance mytest , CONSTRAINT instance_ibfk_1 FOREIGN KEY ( GroupID ) REFERENZE mytest . mytest ( ID )

 drop database mytest; create database mytest; use mytest; CREATE TABLE mygroup ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE=InnoDB; CREATE TABLE instance ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, GroupID INT NOT NULL, DateTime DATETIME DEFAULT NULL, FOREIGN KEY (GroupID) REFERENCES mygroup(ID) ON DELETE CASCADE, UNIQUE(GroupID) ) ENGINE=InnoDB; 

Non è ansible TRUNCATE una tabella su cui sono applicati i vincoli FK ( TRUNCATE non è lo stesso di DELETE ).

Per ovviare a questo, utilizzare una di queste soluzioni. Entrambi presentano rischi di danneggiare l’integrità dei dati.

Opzione 1:

  1. Rimuovi i vincoli
  2. Eseguire TRUNCATE
  3. Elimina manualmente le righe che ora hanno riferimenti in nessun posto
  4. Creare vincoli

Opzione 2: suggerita dall’utente447951 nella risposta

 SET FOREIGN_KEY_CHECKS = 0; TRUNCATE table $table_name; SET FOREIGN_KEY_CHECKS = 1; 

Si, puoi:

 SET FOREIGN_KEY_CHECKS = 0; TRUNCATE table1; TRUNCATE table2; SET FOREIGN_KEY_CHECKS = 1; 

Con queste istruzioni, rischi di inserire righe nelle tue tabelle che non rispettano i vincoli FOREIGN KEY .

Lo farei semplicemente con:

 DELETE FROM mytest.instance; ALTER TABLE mytest.instance AUTO_INCREMENT = 1; 

Come da documentazione MySQL , TRUNCATE non può essere utilizzato su tabelle con relazioni di chiavi esterne. Non esiste un’alternativa completa AFAIK.

L’eliminazione del contraint continua a non richiamare ON DELETE e ON UPDATE. L’unica soluzione a cui riesco a pensare ATM è che:

  • cancellare tutte le righe, rilasciare le chiavi esterne, troncare, ricreare le chiavi
  • cancella tutte le righe, resetta auto_increment (se usato)

Sembrerebbe che TRUNCATE in MySQL non sia ancora una funzionalità completa (non invoca trigger). Vedi il commento

tu puoi fare

 DELETE FROM `mytable` WHERE `id` > 0 

Mentre questa domanda è stata posta più di 5 anni fa e non so che questa funzione esistesse già in MySql, ma ora se usi phpmyadmin puoi semplicemente aprire il database e poi selezionare la tabella (o le tabelle) che vuoi troncare. In fondo c’è un menu a discesa con molte opzioni elencate. Aprilo e seleziona l’opzione Vuota sotto l’intestazione Elimina dati o tabella . Ti porta alla pagina successiva automaticamente dove c’è un’opzione nella casella chiamata Abilita i controlli delle chiavi esterne. Basta deselezionarlo e premere il pulsante Sì e le tabelle selezionate verranno troncate. Può essere che esegua internamente la query suggerita nella risposta dell’utente447951. Ma è molto comodo da usare dall’interfaccia phpmyadmin.

La risposta è in effetti quella fornita da zerkms , come indicato nell’opzione 1 :

Opzione 1 : che non rischia di danneggiare l’integrità dei dati:

  1. Rimuovi i vincoli
  2. Eseguire TRUNCATE
  3. Elimina manualmente le righe che ora hanno riferimenti in nessun posto
  4. Creare vincoli

La parte difficile è Rimozione dei vincoli , quindi voglio dirti come, nel caso qualcuno abbia bisogno di sapere come farlo:

  1. Esegui SHOW CREATE TABLE

    per vedere qual è il tuo nome FOREIGN KEY (Cornice rossa nell’immagine sottostante):

    inserisci la descrizione dell'immagine qui

  2. Esegui ALTER TABLE

    DROP FOREIGN KEY

    . Questo rimuoverà il vincolo di chiave esterna.

  3. Rilascia l’ indice associato (attraverso la pagina della struttura della tabella) e il gioco è fatto.

per ricreare le chiavi esterne:

 ALTER TABLE  ADD FOREIGN KEY () REFERENCES ();

Ottenere lo stato di controllo della chiave esterna vecchia e la modalità sql sono il modo migliore per troncare / Eliminare la tabella mentre Mysql Workbench fa durante la sincronizzazione del modello nel database.

 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,ALLOW_INVALID_DATES'; DROP TABLE TABLE_NAME; TRUNCATE TABLE_NAME; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; 

Se il motore del database per le tabelle differisce, si otterrà questo errore, quindi cambiatele in InnoDB

 ALTER TABLE my_table ENGINE = InnoDB;