2012-03-05 8 views

risposta

12

In SQL Server una tabella a cui fa riferimento un FK non può essere attualmente troncata anche se tutte le tabelle di riferimento sono vuote o le chiavi esterne sono disabilitate.

è necessario utilizzare DELETE (può richiedere molto più logging) o far cadere il rapporto (s) prima di utilizzare TRUNCATE e ricrearli dopo o vedere le soluzioni alternative su this connect item di un modo per raggiungere tale obiettivo utilizzando ALTER TABLE ... SWITCH

+1

sembra una caratteristica piuttosto scadente del prodotto. ma credo che sarà necessario farlo rientrare nel codice. grazie – stats101

3

Eseguire la seguente query per cercare qualsiasi vincolo:

use MyDatabase 
select c.name as c_name, t.name as t_name 
from sys.key_constraints c 
join sys.tables t on t.object_id = c.parent_object_id 

Se alcun vincolo trovato sulla vostra tavola, rimuoverlo.

1

Se si riceve questo errore ed è necessario troncare la tabella, quindi la soluzione alternativa potrebbe essere quella di poter eliminare e ricreare la tabella insieme a
primary/other_keys/indexes/triggers. Assicurati di non aver bisogno dei dati in quella tabella.

Questa anima funziona come un incantesimo per me e difficilmente ha impiegato un minuto per finire. Lo sto facendo per scopi di mascheramento.

4

Non è possibile troncare una tabella su cui è presente un vincolo FK. Per ovviare al problema, è possibile: 1/Eliminare i vincoli 2/Troncare la tabella 3/Ricreare i vincoli.

Qui è lo script T-SQL associati, supponendo di avere 2 tavoli chiamati MyTable e MyReferencedTable:

-- Remove constraint 
IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_MyReferencedTable_MyTable') 
BEGIN 
    ALTER TABLE dbo.MyReferencedTable 
    DROP CONSTRAINT FK_MyReferencedTable_MyTable 
END 


-- Truncate table 
TRUNCATE TABLE dbo.MyTable 


-- Re-Add constraint 
IF NOT EXISTS(SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_MyReferencedTable_MyTable') 
BEGIN 
    ALTER TABLE dbo.MyReferencedTable 
    WITH CHECK ADD CONSTRAINT [FK_MyReferencedTable_MyTable] FOREIGN KEY(ListingKey) 
    REFERENCES dbo.MyTable (ListingKey) 
END 
-3

Invece di eliminare o ricreare il vincolo, preferisco in questo modo più semplice. Disattivare la convalida vincolo eseguendo la seguente interrogazione prima:

SET FOREIGN_KEY_CHECKS=0; 

Poi troncare le tabelle

E, infine, riattivare la convalida vincolo:

SET FOREIGN_KEY_CHECKS=1; 

Quello è un soluzione comune quando si migrare i database, quindi non devi preoccuparti per l'ordine in cui sono inserite le tabelle.

+0

Questa non è un'impostazione valida di SQL Server. –

+0

Questo è per MySQL e non SqlServer. –

Problemi correlati