web-dev-qa-db-fra.com

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

Je dois supprimer toutes les lignes d'une table, mais lorsque j'ajoute une nouvelle ligne, je souhaite que l'ID de clé primaire, qui a une incrémentation automatique, recommence à 0 ou 1.

169
marek_lani

Ne pas supprimer, utilisez tronquer:

Truncate table XXX

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

Source .

289
Francois

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 suppression de toutes les lignes pour redémarrer l'auto_increment:

ALTER TABLE mytable AUTO_INCREMENT = 1
76

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.

16
blacky

Un fait intéressant.

J'étais certain que TRUNCATE obtiendrait toujours de meilleurs résultats, mais dans mon cas, pour une base de données contenant environ 30 tables contenant des clés étrangères, contenant seulement quelques lignes, il fallait environ 12 secondes à TRUNCATE toutes les tables, par opposition à seulement quelques centaines de millisecondes pour DELETE les lignes. Le réglage de l’incrément automatique ajoute environ une seconde au total, mais c’est beaucoup mieux.

Donc, je vous suggère d'essayer les deux, voir ce qui fonctionne plus rapidement pour votre cas.

8
Sorin