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.
185
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 .
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
la source
DELETE FROM tablename;
(mais cela ne fonctionnera pas bien quand il y a des contraintes FK - voir stackoverflow.com/a/5452798/507761 )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.
la source
Un fait intéressant.
J'étais sûr que
TRUNCATE
les 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 àTRUNCATE
toutes les tables, par opposition à seulement quelques centaines de millisecondes pourDELETE
le 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.
la source
si vous souhaitez utiliser,
truncate
utilisez ceci:SET FOREIGN_KEY_CHECKS = 0; TRUNCATE table $table_name; SET FOREIGN_KEY_CHECKS = 1;
la source