2011-12-27 25 views
25

Uso il datamapper con ruby ​​per archiviare dati su determinate tabelle.Come troncare le tabelle correttamente?

Numerose tabelle contengono grandi quantità di informazioni e desidero cancellarle quando l'utente "ricostruisce il database" (in pratica elimina tutto e ricalcola i dati).

Inizialmente ho provato Forum.all.destroy e l'ho fatto per tutti i diversi tavoli, ma ho notato che alcuni di loro sono stati cancellati da phpmyadmin. posso solo immaginarlo a causa delle chiavi straniere. Anche se davvero non lo so perché il mio altro tavolo con le chiavi di Foreing è stato cancellato con successo. Per non parlare, id piuttosto che "zero" è fuori comunque in modo che le chiavi non arrivino a numeri straordinariamente grandi (come la chiave # 500.000).

Ho quindi provato a eseguirlo con il codice riportato di seguito, ma non cancella i tavoli a causa di "vincoli di chiave esterna". Voglio forzarlo a funzionare perché so per certo che sto eliminando tutte le tabelle che si basano l'una sull'altra (non sto cancellando solo 2 tabelle, una tabella delle impostazioni e una tabella di archiviazione casuale, nessuna delle quali usa chiavi esterne).

Finora ho ...

adapter = DataMapper.repository(:default).adapter 
adapter.execute('TRUNCATE TABLE `forums`, `dates`, `remarks`'); 

Sarebbe bene, tranne la sintassi mysql è sbagliato a quanto pare. quindi questo è la prima cosa

ho fatto 1 da 1 a phpMyAdmin e quando l'ho fatto in questo modo si dice

Cannot truncate a table referenced in a foreign key constraint 

risposta

82

Piano A:

SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checking. 
TRUNCATE TABLE forums; 
TRUNCATE TABLE dates; 
TRUNCATE TABLE remarks; 
SET FOREIGN_KEY_CHECKS = 1; -- Enable foreign key checking. 

Plan B:

È necessario troncare le tabelle figlio in primo luogo, quindi le tabelle padre.

La disattivazione dei controlli di chiave esterna rischia di inserire righe nelle tabelle che non rispettano i vincoli che possono causare un comportamento non definito.

+0

qualche idea su come fare questo in rubino? Ho provato a eseguire ciascun comando separatamente all'interno dell'app e non ha eliminato nulla. Ho quindi provato a eseguirli uno per uno in phpmyadmin in ordine e dice ancora # 1701 - Impossibile troncare una tabella a cui fa riferimento un vincolo di chiave esterna – Tallboy

+1

scratch that! ha funzionato ... era solo lì per un millisecondo prima di riaggiungere i miei dati e io non l'ho preso in realtà troncando. Grazie! – Tallboy

+1

Ho troncato le tabelle figlio, ma anche in questo caso non riesce durante l'eliminazione della tabella padre. Ad ogni modo, ho usato l'hack per disabilitare i controlli delle chiavi esterne per ora. – inquisitive

9

Invece di utilizzare Disabilitare il controllo della chiave esterna.

È possibile utilizzare il codice seguente.

DELETE FROM forums; 
ALTER TABLE forums AUTO_INCREMENT = 1; 

DELETE FROM dates; 
ALTER TABLE dates AUTO_INCREMENT = 1; 

DELETE FROM remarks; 
ALTER TABLE remarks AUTO_INCREMENT = 1; 

Sarà solo eliminare tutte le righe e fare incremento ID da 1 in poi.

Problemi correlati