À l'aide de MSSQL2005, puis-je tronquer une table avec une contrainte de clé étrangère si je tronque d'abord la table enfant (la table avec la clé primaire de la relation FK)?
Je sais que je peux
- Utiliser un
DELETE
clause sans une où, puisRESEED
l'identité (ou) - Retirez le FK, tronquez la table et recréez le FK.
Je pensais que tant que je tronquerais la table enfant avant le parent, je serais d'accord sans faire l'une des options ci-dessus, mais j'obtiens cette erreur:
Impossible de tronquer la table 'TableName' car elle est référencée par une contrainte FOREIGN KEY.
la source
Notez que ce n'est probablement pas ce que vous voudriez si vous avez des millions + d'enregistrements, car c'est très lent.
la source
Étant donné qu'il
TRUNCATE TABLE
s'agit d'une commande DDL , il ne peut pas vérifier si les enregistrements de la table sont référencés par un enregistrement de la table enfant.C'est pourquoi cela
DELETE
fonctionne etTRUNCATE TABLE
ne fonctionne pas: car la base de données est en mesure de s'assurer qu'elle n'est pas référencée par un autre enregistrement.la source
Sans pour autant
ALTER TABLE
En tant que procédure stockée
https://github.com/reduardo7/TableTruncate
Notez que ce n'est probablement pas ce que vous voudriez si vous avez des millions + d'enregistrements, car c'est très lent.
la source
La solution @denver_citizen fournie ci-dessus n'a pas fonctionné pour moi, mais j'ai aimé l'esprit de celle-ci, j'ai donc modifié quelques éléments:
Pour le bénéfice du public, voici le script mis à jour:
la source
utilisez la commande suivante après la suppression de toutes les lignes de cette table à l'aide de l'instruction delete
EDIT: syntaxe corrigée pour SQL Server
la source
TRUNCATE
évite le journal et est considérablement plus rapide queDELETE
pour les grandes tables. En tant que tel, ce n'est pas une véritable solution équivalente.Eh bien, puisque je n'ai pas trouvé d' exemples de la solution très simple que j'ai utilisée, qui est:
Ça y est:
1) Trouvez le nom de la clé étrangère qui est à l'origine de l'échec (par exemple: FK_PROBLEM_REASON, avec champ
ID
, de la tableTABLE_OWNING_CONSTRAINT
) 2) Supprimez cette clé de la table:3) Tronquer la table souhaitée
4) Ajoutez de nouveau la clé à cette première table:
C'est ça.
la source
Voici un script que j'ai écrit afin d'automatiser le processus. J'espère que ça aide.
la source
sys.foreign_keys
tableau. ( Référence )vous pouvez suivre cette étape, en
reseeding table
supprimant les données de la table.si une erreur survient, vous devez réamorcer la table principale.
la source
la source
Si je comprends bien, ce que vous voulez faire est d'avoir un environnement propre à configurer pour la base de données impliquant des tests d'intégration.
Mon approche ici serait de supprimer tout le schéma et de le recréer plus tard.
Les raisons:
la source
Trouvé ailleurs sur le web
la source
Vous ne pouvez pas tronquer une table si vous ne supprimez pas les contraintes. Une désactivation ne fonctionne pas non plus. vous devez tout laisser tomber. j'ai fait un script qui supprime toutes les contraintes et recrée ensuite.
Assurez-vous de l'envelopper dans une transaction;)
la source
Les réponses de @denver_citizen et @Peter Szanto n'ont pas vraiment fonctionné pour moi, mais je les ai modifiées pour tenir compte:
la source
tronquer n'a pas fonctionné pour moi, supprimer + réamorcer est la meilleure solution. Dans le cas où certains d'entre vous auraient besoin d'itérer sur un grand nombre de tables pour effectuer la suppression + le réamorçage, vous pourriez rencontrer des problèmes avec certaines tables qui n'ont pas de colonne d'identité, le code suivant vérifie si la colonne d'identité existe avant d'essayer réensemencer
la source
J'écris les façons suivantes et j'ai essayé de les paramétrer, afin que vous puissiez les exécuter dans un
Query document
ou en faire un utilitaireSP
facilement avec eux .A) Supprimer
Si votre table n'a pas des millions d'enregistrements, cela fonctionne bien et n'a pas de commandes Alter :
B) Tronquer
Si votre table a des millions d'enregistrements ou si vous n'avez aucun problème avec la commande Alter dans vos codes, utilisez celui-ci:
la source
C'est ma solution à ce problème. Je l'ai utilisé pour modifier PK, mais je pense la même chose. J'espère que cela vous sera utile)
la source
Pour
MS SQL
, au moins les versions les plus récentes, vous pouvez simplement désactiver les contraintes avec du code comme celui-ci:la source
Ce qui suit fonctionne pour moi même avec des contraintes FK et combine les réponses suivantes pour supprimer uniquement les tables spécifiées :
Remarque:
Je pense qu'il est toujours utile de déclarer les tables dans l'ordre dans lequel vous souhaitez les supprimer (c'est-à-dire tuer les dépendances en premier). Comme vu dans cette réponse , plutôt que de boucler des noms spécifiques, vous pouvez remplacer toutes les tables par
la source
DELETE
n'est pas le même queTRUNCATE
. Cela remplira vos journaux de transactions.Si aucune de ces réponses n'a fonctionné comme dans mon cas, procédez comme suit:
Bonne chance!
la source
Supprimer puis réinitialiser l'incrémentation automatique:
puis
la source
La seule façon est de supprimer les clés étrangères avant de tronquer. Et après avoir tronqué les données, vous devez recréer les index.
Le script suivant génère le SQL requis pour supprimer toutes les contraintes de clé étrangère.
Ensuite, le script suivant génère le SQL requis pour recréer des clés étrangères.
Exécutez le script généré pour supprimer toutes les clés étrangères, tronquer les tables, puis exécutez le script généré pour recréer toutes les clés étrangères.
Les requêtes sont prises à partir d' ici .
la source
Dans SSMS, j'avais un diagramme ouvert montrant la clé. Après avoir supprimé la clé et tronqué le fichier, j'ai actualisé puis me suis concentré sur le diagramme et créé une mise à jour en effaçant puis en restaurant une boîte d'identité. L'enregistrement du diagramme a fait apparaître une boîte de dialogue Enregistrer, puis une boîte de dialogue "Des modifications ont été apportées dans la base de données pendant que vous travailliez", en cliquant sur Oui, vous avez restauré la clé, en la restaurant à partir de la copie verrouillée dans le diagramme.
la source
Si vous faites cela à une fréquence quelconque, même sur un calendrier, je n'utiliserais absolument, sans équivoque, aucune instruction DML. Le coût d'écriture dans le journal des transactions est trop élevé et la configuration de
SIMPLE
mode de récupération pour tronquer une table est ridicule.La meilleure façon, c'est malheureusement la voie difficile ou laborieuse. Cet être:
Mon processus pour ce faire implique les étapes suivantes:
Les scripts de cette nature doivent être exécutés dans un bloc
begin tran
etcommit tran
.la source
Je viens de découvrir que vous pouvez utiliser la table TRUNCATE sur une table parent avec des contraintes de clé étrangère sur un enfant tant que vous désactivez les contraintes sur le table enfant en premier. Par exemple
Clé étrangère CONSTRAINT child_par_ref sur la table enfant, référence PARENT_TABLE
la source
La manière la plus simple:
1 - Entrez dans phpmyadmin
2 - Cliquez sur le nom de la table dans la colonne de gauche
3 - Cliquez sur Operation (menu supérieur)
4 - Cliquez sur "Vider la table (TRUNCATE)
5 - Désactivez la case" Activer les vérifications des clés étrangères "
6 - Terminé !
Lien vers le tutoriel d'image
Tutoriel: http://www.imageno.com/wz6gv1wuqajrpic.html
(désolé, je n'ai pas assez de réputation pour télécharger des images ici: P)
la source
Tu pourrais essayer
DELETE FROM <your table >;
.Le serveur vous montrera le nom de la restriction et de la table, et en supprimant cette table, vous pouvez supprimer ce dont vous avez besoin.
la source
référence - tronquer la table contrainte de clé étrangère
Travailler pour moi dans MYSQL
la source