web-dev-qa-db-fra.com

Comment tronquer correctement les tableaux?

J'utilise datamapper avec Ruby pour stocker des données dans certaines tables.

Plusieurs des tableaux contiennent de très grandes quantités d'informations et je veux les effacer lorsque l'utilisateur "reconstruit la base de données" (il supprime essentiellement tout et recalcule les données).

À l'origine, j'ai essayé Forum.all.destroy et l'ai fait pour toutes les différentes tables, mais j'ai remarqué que certaines d'entre elles venaient d'être supprimées de phpmyadmin. je ne peux que l'imaginer à cause des clés étrangères. Bien que je ne sache vraiment pas parce que mon autre table a été supprimée avec succès. Sans parler, je préfère tout simplement "zéro" de toute façon afin que les clés n'atteignent pas des nombres extraordinairement grands (comme la clé # 500 000).

J'ai ensuite essayé de l'exécuter avec le code ci-dessous, mais il n'efface pas les tables en raison de "contraintes de clé étrangère". Je veux le forcer à fonctionner parce que je sais que je supprime toutes les tables qui dépendent les unes des autres (je ne supprime pas seulement 2 tables, une table de paramètres et une table de stockage aléatoire, aucune des deux n'utilisant clés étrangères).

Jusqu'à présent, j'ai ...

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

Ce serait bien, sauf que la syntaxe mysql est apparemment erronée. c'est donc la première chose

Je l'ai fait 1 par 1 en phpmyadmin et quand je l'ai fait de cette façon, il est dit

Cannot truncate a table referenced in a foreign key constraint
39
Tallboy

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:

Vous devez d'abord tronquer les tables enfants, puis les tables parent.

La désactivation des vérifications de clé étrangère risque d'entrer des lignes dans vos tables qui n'adhèrent pas aux contraintes qui peuvent provoquer un comportement indéfini.

96
Devart

Au lieu d'utiliser Désactiver la vérification des clés étrangères.

Vous pouvez utiliser le code ci-dessous.

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;

Il supprimera simplement toutes les lignes et augmentera l'identifiant à partir de 1

14
Phoenix