Tronquer à la condition
tronquer ->cela permet de réinitialiser l'ensemble de la table, est-il un moyen via tronquer pour réinitialiser certains dossiers/vérifier les conditions.
Ex: je veux réinitialiser toutes les données et de maintenir les 30 derniers jours, à l'intérieur de la table.
Grâce.
- En fait, si le tableau est séparé en partitions, vous pouvez tronquer sélectionné uniquement des partitions, donc pas whipe à toute la table.
Vous devez vous connecter pour publier un commentaire.
Non,
TRUNCATE
est tout ou rien. Vous pouvez faire unDELETE FROM <table> WHERE <conditions>
mais cela perd de la vitesse avantages deTRUNCATE
.La réponse courte est pas: MySQL ne pas vous permettent d'ajouter une
WHERE
clauseTRUNCATE
déclaration. Voici La documentation de MySQL sur leTRUNCATE
déclaration.Mais la bonne nouvelle est que vous pouvez (un peu) de contourner cette limitation.
Simple, sûre, propre, mais lente de la solution à l'aide de
DELETE
Tout d'abord, si la table est assez petit, il suffit d'utiliser la
DELETE
déclaration (il devait être mentionnée):La
LOCK
etUNLOCK
déclarations ne sont pas obligatoires, mais ils vont accélérer les choses et d'éviter d'éventuels blocages.Malheureusement, ce sera très lent si votre table est grande... et depuis que vous envisagez d'utiliser le
TRUNCATE
déclaration, je suppose que c'est parce que votre table est grande.Voici donc une façon de résoudre votre problème à l'aide de la
TRUNCATE
déclaration:Simple, rapide, mais dangereux solution à l'aide de
TRUNCATE
Malheureusement, cette solution est un peu dangereux si d'autres processus de l'insertion d'enregistrements dans la table en même temps:
TRUNCATE
déclaration réinitialise leAUTO-INCREMENT
compteur à zéro. De sorte que tout enregistrement inséré entre les étapes 2 et 3 aura un ID qui sera plus faible que les anciens Identifiants et qui peuvent même entrer en conflit avec les Id inséré à l'étape 4 (à noter que laAUTO-INCREMENT
compteur sera de retour à sa juste valeur, après l'étape 4).Malheureusement, il n'est pas possible de verrouiller la table et de le tronquer. Mais nous pouvons (en quelque sorte) travail autour de que limitation à l'aide
RENAME
.Demi-simple, rapide, sûr, mais bruyant solution à l'aide de
TRUNCATE
Cela devrait être complètement sûr et assez rapide. Le seul problème est que les autres processus pourrez voir le tableau
my_table
disparaître pendant quelques secondes. Cela peut conduire à des erreurs affichées dans les journaux de partout. C'est donc une solution sûre, mais il est "bruyant".Avertissement: je ne suis pas un MySQL expert, de sorte que ces solutions pourrait être en réalité de merde. La seule garantie que je peux vous offrir, c'est qu'ils fonctionnent très bien pour moi. Si certains experts peuvent faire des commentaires sur ces solutions, je vous serais reconnaissant.
Comme une réponse à votre question:
"je veux réinitialiser toutes les données et de maintenir les 30 derniers jours, à l'intérieur de la table."
vous pouvez créer un événement. Vérifier https://dev.mysql.com/doc/refman/5.7/en/event-scheduler.html
Par exemple:
Va exécuter un nettoyage quotidien de votre table, en gardant les 30 derniers jours des données disponibles
Vous pouvez simplement exporter la table avec une requête à l'aide de la clause datapump et les importer de nouveau avec table_exists_action=remplacer la clause. Sa volonté de supprimer et recréer votre table et prend très moins de temps. Veuillez lire à ce sujet avant la mise en œuvre.