520 votes

Impossible de tronquer la table parce qu'il est référencé par une contrainte de CLÉ ÉTRANGÈRE?

À l'aide de MSSQL2005, je peux tronquer une table avec une contrainte de clé étrangère si j'ai d'abord tronquer l'enfant de la table (la table avec la clé primaire de la FK relation)?

Je sais que je peux soit

  • Utiliser un DELETE sans clause where, puis RESEED l'identité du (ou des)
  • Supprimer la FK, tronquer la table, et de recréer la FK.

J'ai pensé que tant que j'ai tronqué la table d'enfant avant que le parent, je serais d'accord sans en faire l'une des options ci-dessus, mais j'obtiens cette erreur:

Impossible de tronquer la table "TableName", car il est référencé par une contrainte de CLÉ ÉTRANGÈRE.

424voto

John Rudy Points 16436

Correct; vous ne pouvez pas tronquer une table qui a un FK contrainte.

Généralement mon processus est la suivante:

  1. Déposer les contraintes
  2. Trunc la table
  3. Recréer les contraintes.

(Toutes dans une transaction, bien sûr.)

Bien sûr, cela s'applique seulement si l' enfant a déjà été tronqué. Sinon, je vais un itinéraire différent, dépendant entièrement de ce que mon apparence des données. (Trop de variables pour obtenir ici.)

L'affiche originale de déterminer POURQUOI c'est le cas; voir cette réponse pour plus de détails.

419voto

s15199d Points 900
DELETE FROM TABLENAME
DBCC CHECKIDENT ('DATABASENAME.dbo.TABLENAME',RESEED, 0)

227voto

ctrlShiftBryan Points 5620

Parce qu' TRUNCATE TABLE est une commande DDL, il ne peut pas vérifier pour voir si les enregistrements dans la table référencée par un enregistrement dans la table enfant.

C'est pourquoi, DELETE d'œuvres et d' TRUNCATE TABLE n'est pas: car la base de données est en mesure de s'assurer qu'elle n'est pas référencé par un autre record.

110voto

Eduardo Cuomo Points 1433

Sans ALTER TABLE

-- Delete all records
DELETE FROM [TableName]
-- Set current ID to "1"
DBCC CHECKIDENT ([TableName], RESEED, 1)

22voto

abdelwahed Points 69

utilisez la commande suivante après la suppression de toutes les lignes dans la table en utilisant l'instruction delete

delete from tablename

DBCC CHECKIDENT ('tablename', RESEED, 0)

EDIT: correction de la syntaxe de SQL Server

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X