MySQL Supprime toutes les lignes de la table et réinitialise l'ID à zéro

185

J'ai besoin de supprimer toutes les lignes d'une table mais lorsque j'ajoute une nouvelle ligne, je veux que l'ID de clé primaire, qui a un incrément automatique, recommence à partir de 0 respectivement à partir de 1.

marek_lani
la source

Réponses:

311

Ne pas supprimer, utiliser tronquer:

Truncate table XXX

Le gestionnaire de table ne se souvient pas de la dernière valeur AUTO_INCREMENT utilisée, mais commence à compter depuis le début. Cela est vrai même pour MyISAM et InnoDB, qui ne réutilisent normalement pas les valeurs de séquence.

Source .

François
la source
20
Truncate fonctionne bien avec les tables non contraintes, mais si votre table a une contrainte de clé étrangère, vous pouvez envisager d'utiliser la méthode Delete. Voir cet article si vous avez des contraintes FK: tronquer la table contrainte de clé étrangère
Julian Soro
1
rappelez-vous que la table tronquée ne va pas être restaurée
penny chan
84

Si vous ne pouvez pas utiliser TRUNCATE(par exemple en raison de contraintes de clé étrangère), vous pouvez utiliser une table alter après avoir supprimé toutes les lignes pour redémarrer l'auto_increment:

ALTER TABLE mytable AUTO_INCREMENT = 1
un cheval sans nom
la source
3
@NBhargav Comme vous utilisez peut-être le moteur InnoDB sur votre table au lieu de MyISAM, le premier ne prend pas en charge la réinitialisation de l'index.
Gustavo Rubio
comment supprimer toutes les lignes avant de modifier la valeur
auto_increment
@KasunSiyambalapitiya DELETE FROM tablename;(mais cela ne fonctionnera pas bien quand il y a des contraintes FK - voir stackoverflow.com/a/5452798/507761 )
Matthew Read le
17

Si la table a des clés étrangères, j'utilise toujours le code suivant:

SET FOREIGN_KEY_CHECKS = 0; -- disable a foreign keys check
SET AUTOCOMMIT = 0; -- disable autocommit
START TRANSACTION; -- begin transaction

/*
DELETE FROM table_name;
ALTER TABLE table_name AUTO_INCREMENT = 1;
-- or
TRUNCATE table_name;
-- or
DROP TABLE table_name;
CREATE TABLE table_name ( ... );
*/

SET FOREIGN_KEY_CHECKS = 1; -- enable a foreign keys check
COMMIT;  -- make a commit
SET AUTOCOMMIT = 1 ;

Mais la différence sera dans le temps d'exécution. Regardez ci-dessus la réponse de Sorin.

noirâtre
la source
2
C'est un bon moyen d'avoir des données orphelines dans n'importe quelle table que des clés étrangères à la table que vous effacez. L'activation des vérifications de clés étrangères après le fait n'entraîne pas MySQL à revalider ces clés étrangères pour autant que je sache. Cela vous laisse avec des lignes qui contiennent des données qui n'existent pas dans la table de référence. Vous pouvez aussi ne pas avoir du tout de clés étrangères sur votre table.
cimmanon
8

Un fait intéressant.

J'étais sûr que TRUNCATEles performances seront toujours meilleures, mais dans mon cas, pour une base de données avec environ 30 tables avec des clés étrangères, peuplée de seulement quelques lignes, il a fallu environ 12 secondes à TRUNCATEtoutes les tables, par opposition à seulement quelques centaines de millisecondes pour DELETEle Lignes. Le réglage de l'incrémentation automatique ajoute environ une seconde au total, mais c'est toujours beaucoup mieux.

Je suggérerais donc d'essayer les deux, voir ce qui fonctionne le plus rapidement pour votre cas.

Sorin
la source
4

si vous souhaitez utiliser, truncateutilisez ceci:

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
david2020
la source
Pour tester et déboguer une base de données, c'est TOTALEMENT la réponse.
Alan Stewart