2010-04-08 13 views
16

Je tente de nettoyer une table sans pour autant me débarrasser de la structure réelle de la table. J'ai une colonne id qui s'incrémente automatiquement; Je n'ai pas besoin de conserver le numéro d'identification, mais j'en ai besoin pour conserver sa caractéristique d'auto-incrémentation. J'ai trouvé supprimer et tronquer, mais je suis inquiet que l'un d'entre eux abandonne complètement la table rendant les futures commandes d'insertion inutiles. Comment puis-je supprimer tous les enregistrements de la table afin que je puisse insérer de nouvelles données?Supprimer, tronquer ou supprimer pour nettoyer une table dans MySQL

Répondre

14

TRUNCATE rétablirons votre graine auto-incrément (sur les tables InnoDB, au moins), bien que vous puissiez noter sa valeur avant tronquer et remettre en conséquence en utilisant la suite alter table:

ALTER TABLE t2 AUTO_INCREMENT = value 
+0

Bon point sur notant la graine auto-incrément! J'ai oublié de mentionner que –

+0

je vois merci l'homme! –

18

drop table enlèvera toute la table avec les données

delete * from table va supprimer les données, laissant les valeurs autoincrement seules. cela prend également un certain temps s'il y a beaucoup de données dans la table.

truncate table va supprimer les données, réinitialiser les valeurs auto-incrémentation (mais les laisser comme des colonnes auto-incrémentées, donc il va juste commencer à 1 et remonter à partir de là), et est très rapide.

+0

Pour InnoDB 'TRUNCATE' n'est pas si rapide, car il fait DROP + CREATE en interne. Tronquer 200 petites tables prend plusieurs secondes sur mon système de développement ... – Marki555

+1

La suppression de données est une opération entièrement enregistrée. Les données tronquées sont journalisées de manière minimale –

1

Une autre possibilité consiste à créer une copie vide de la table, le réglage de la AUTO_INCREMENT (avec une certaine marge de manœuvre éventuelle pour les insertions pendant l'opération non atomique), puis tourner à la fois:

CREATE TABLE t2_new LIKE t2; 

SELECT @newautoinc:=auto_increment /*+[leeway]*/ 
    FROM information_schema.tables 
WHERE table_name='t2'; 

SET @query = CONCAT("ALTER TABLE t2_new AUTO_INCREMENT = ", @newautoinc); 
PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

RENAME TABLE t2 TO t2_old, t2_new TO t2; 

Et puis, vous avez la avantage supplémentaire d'être encore capable de changer d'avis avant de retirer l'ancienne table.

Si vous reconsidérer votre décision, vous pouvez toujours ramener les anciens enregistrements de la table avant l'opération:

INSERT /*IGNORE*/ INTO t2 SELECT * FROM t2_old /*WHERE [condition]*/; 

Quand vous êtes bon, vous pouvez laisser tomber la vieille table:

DROP TABLE t2_old; 
4

      Drop fera juste cela .... laisser tomber la table en question, sauf si la table est un parent à une autre table.

      Supprimer va supprimer toutes les données qui remplit la condition; Si aucune condition n'est spécifiée, toutes les données de la table seront supprimées.
      Truncate est similaire à delete; cependant, il réinitialise le compteur auto_increment à 1 (ou la valeur de départ initiale). Toutefois, il est préférable d'utiliser la suppression tronquée car supprimer supprime les données de chaque ligne, ce qui a un impact sur les performances de tronqué.Cependant, tronqué ne fonctionnera pas sur InnoDB tables où l'intégrité référentielle est appliquée sauf si elle est désactivée avant l'exécution de la commande truncate.
      Alors, détendez-vous; À moins que vous n'émettiez une commande drop sur la table, elle ne sera pas supprimée.