Comment tronquer un tableau à l'aide de Doctrine 2?
Je suppose que j'ai besoin de construire une requête native de tronquer une table à l'aide de Doctine2.
$emptyRsm = new \Doctrine\ORM\Query\ResultSetMapping();
$sql = 'TRUNCATE TABLE Article';
$query = em()->createNativeQuery($sql, $emptyRsm);
$query->execute();
Cela donne l'erreur
SQLSTATE[HY000]: General error
Que dois-je modifier mon code pour faire ce travail?
- Votre syntaxe est correcte. Avez-vous essayé d'utiliser "SUPPRIMER DE l'Article".
- Il est peut-être une clé étrangère référençant un champ dans la table en cours de suppression. Avez-vous essayez d'exécuter votre requête à partir de la console MySQL?
Vous devez vous connecter pour publier un commentaire.
Méfiez-vous de Tronquer les Tables
Méfiez-vous de tronquer les tables dans tous les SGBDR, surtout si vous souhaitez utiliser les transactions explicites pour commit/rollback de la fonctionnalité. Veuillez lire le "Ma recommandation" de cette réponse.
Instructions DDL effectuer un implicite de validation
Truncate table déclarations sont langage de définition de données (DDL), et en tant que tel truncate table des déclarations de déclencher un implicite
COMMIT
à la base de données au moment de leur exécution. Si vous effectuez uneTABLE TRUNCATE
la base de données est implicitement engagé à, même si laTABLE TRUNCATE
est dans unSTART TRANSACTION
déclaration, votre table sera tronqué et unROLLBACK
sera pas restaurer.Parce que truncate table des déclarations effectuer implicite s'engage, Maxence réponse ne fonctionne pas comme prévu (mais ce n'est pas mal, parce que la question était "comment tronquer un tableau"). Sa réponse ne fonctionne pas comme prévu, car il tronque la table dans une
try
bloc, et suppose que la table peut être restauré dans lecatch
bloc, si quelque chose va mal. C'est une hypothèse erronée.D'autres commentaires de l'utilisateur & expériences dans ce fil
ChrisAelbrecht n'a pas pu obtenir Maxence solution à fonctionner correctement car vous ne pouvez pas annuler une instruction truncate table, même si l'instruction truncate table est dans une transaction explicite.
user2130519, malheureusement, a été downvoted (-1 jusqu'à ce que je upvoted) pour fournir la bonne réponse-bien qu'il l'a fait sans avoir à motiver sa réponse, qui est comme faire des maths sans montrer votre travail.
Ma recommandation
DELETE FROM
Ma recommandation est d'utiliser
DELETE FROM
. Dans la plupart des cas, il fonctionnera comme le développeur. Mais,DELETE FROM
n'est pas sans inconvénients non plus-vous devez explicitement réinitialiser l'auto incrémentation de la valeur de la table. Pour réinitialiser l'auto incrémentation de la valeur de la table, vous devez utiliser une autre instruction DDL--ALTER TABLE
--et, une fois encore, ne pas utiliserALTER TABLE
dans votretry
bloc. Il ne fonctionnera pas comme prévu.Si vous voulez des conseils sur le moment où vous devez utiliser
DELETE FROM
vsTRUNCATE
voir Pour & les Inconvénients de TRONQUER vs SUPPRIMER à PARTIR de.Si vous devez vraiment, voici comment tronquer
Maintenant, avec tout ce que dit. Si vous voulez vraiment de tronquer une table à l'aide de Doctrine2, utilisez ceci: (ci-Dessous, la partie de Maxence de répondre correctement tronque un tableau)
Comment supprimer une table avec la restauration/validation functionalty.
Mais, si vous voulez la restauration/validation de la fonctionnalité, vous devez utiliser
DELETE FROM
: (ci-Dessous est une version modifiée de Maxence réponse.)Si vous devez réinitialiser l'auto incrémentation de la valeur, n'oubliez pas d'appeler
ALTER TABLE <tableName> AUTO_INCREMENT = 1
.$em->clear();
après la commande alter ou vous avez une chance d'insérer un nouveau record à la base de donnéesTRUNCATE is transaction-safe with respect to the data in the tables: the truncation will be safely rolled back if the surrounding transaction does not commit.
Voici le code que j'utilise:
$em->getConnection()->query('START TRANSACTION;SET FOREIGN_KEY_CHECKS=0; TRUNCATE table1; TRUNCATE table2;SET FOREIGN_KEY_CHECKS=1; COMMIT;')
Ou vous pouvez essayer ceci:
Si vous avez des relations, vous devez être prudent pour gérer les entités liées.
C'est l'exemple de tronquer la méthode de trait dans les tests unitaires.
Veuillez noter que si vous n'utilisez pas
$em->flush()
, vous avez un risque d'avoir un problème avec la requête suivante à la doctrine.Aussi, vous devez comprendre que si vous utilisez cette méthode dans un contrôleur, vous devez changer les lignes
fwrite(STDERR, print_r(...
à quelque chose de votre enregistreur de service peut utiliser.