2011-12-27 25 views
25

Estoy usando datamapper con ruby ​​para almacenar datos en ciertas tablas.¿Cómo trunco ​​las tablas correctamente?

Varias de las tablas tienen una gran cantidad de información y quiero borrarlas cuando el usuario 'reconstruye la base de datos' (básicamente borra todo y vuelve a calcular los datos).

Originalmente probé Forum.all.destroy y lo hice para todas las tablas diferentes, pero noté que algunas de ellas simplemente no se borraron de dentro de phpmyadmin. solo puedo imaginarlo debido a las claves externas. Aunque realmente no lo sé porque mi otra mesa, cuyas claves externas se eliminaron con éxito. Sin mencionar, id más bien simplemente 'cero' de todas formas para que las teclas no lleguen a números extraordinariamente grandes (como la clave # 500,000).

Luego intenté ejecutarlo con el siguiente código, pero no borra las tablas debido a "restricciones de clave externa". Quiero forzarlo a que funcione porque sé con certeza que estoy limpiando todas las tablas que dependen unas de otras (no solo estoy eliminando 2 tablas, una tabla de configuraciones y una tabla de almacenamiento aleatorio, ninguna de las cuales usa llaves extranjeras).

Hasta ahora he ...

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

que estaría bien, excepto la sintaxis de MySQL está mal aparentemente. así que eso es lo primero que

lo hice 1 por 1 en phpmyadmin y cuando lo hice de esa manera se dice

Cannot truncate a table referenced in a foreign key constraint 

Respuesta

82

Plan 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:

Debería truncar primero las tablas secundarias y luego las tablas principales.

Al desactivar las comprobaciones de claves foráneas se corre el riesgo de ingresar filas en sus tablas que no se adhieren a las restricciones que pueden causar un comportamiento indefinido.

+0

alguna idea de cómo hacer esto en ruby? Intenté ejecutar cada comando por separado dentro de la aplicación y no eliminó nada. Luego intenté ejecutarlos uno por uno en phpmyadmin en orden y todavía dice # 1701 - No se puede truncar una tabla a la que se hace referencia en una restricción de clave externa – Tallboy

+1

¡rayar eso! funcionó ... solo estuvo ahí por un milisegundo antes de que volviera a agregar mis datos y no lo capté realmente truncado. ¡Gracias! – Tallboy

+1

Trunqué las tablas secundarias, pero incluso eso falla al eliminar la tabla padre. De todos modos, utilicé el truco de deshabilitar los controles de claves extranjeras por ahora. – inquisitive

9

En lugar de usar Desactiva la comprobación de clave externa.

Puede usar el siguiente código.

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; 

se acaba de borrar todas las filas y hacer Identificación del incremento de 1 en adelante.

Cuestiones relacionadas