Domanda

Se voglio eliminare tutte le tabelle nel mio database come questo, ci vuole cura del vincolo di chiave esterna? Se no, come faccio a prendere cura di quella prima?

GO
IF OBJECT_ID('dbo.[Course]','U') IS NOT NULL
    DROP TABLE dbo.[Course]
GO
IF OBJECT_ID('dbo.[Student]','U') IS NOT NULL
    DROP TABLE dbo.[Student]
È stato utile?

Soluzione

No, questo non cadere il vostro tavolo se ci sono chiavi infatti esterna che fa riferimento esso.

Per ottenere tutte le relazioni di chiave esterna referenziare la tua tabella, è possibile utilizzare questo SQL (se siete su SQL Server 2005 e su):

SELECT * 
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')

e se ci sono, con questa affermazione qui, è possibile creare istruzioni SQL effettivamente cadere quelle relazioni FK:

SELECT 
    'ALTER TABLE [' +  OBJECT_SCHEMA_NAME(parent_object_id) +
    '].[' + OBJECT_NAME(parent_object_id) + 
    '] DROP CONSTRAINT [' + name + ']'
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')

Altri suggerimenti

In SQL Server Management Studio 2008 (R2) e più recenti, è possibile fare clic destro sul

  

DB -> Operazioni -> generare script

  • Selezionare le tabelle che si desidera eliminare.

  • Selezionare "Salva nuova finestra di query".

  • Fare clic sul pulsante Avanzate.

  • GOCCIA

    Set di script e CREATE a Script GOCCIA.

  • Set Scrittura chiavi esterne per True.

  • Fare clic su OK.

  • Fare clic su Avanti -> Avanti -.> Fine

  • Visualizza la sceneggiatura e poi Esegui.

Se si lascia cadere la tabella "bambino" in primo luogo, la chiave esterna verrà abbandonato pure. Se si tenta di eliminare la tabella "padre" in primo luogo, si otterrà un "Impossibile eliminare oggetto 'a' perché fa riferimento un vincolo FOREIGN KEY." di errore.

Ecco un altro modo per eliminare tutte le tabelle in modo corretto, utilizzando la procedura sp_MSdropconstraints. Il codice più breve mi veniva in mente:

exec sp_MSforeachtable "declare @name nvarchar(max); set @name = parsename('?', 1); exec sp_MSdropconstraints @name";
exec sp_MSforeachtable "drop table ?";

Se è SQL Server è necessario eliminare il vincolo prima di poter eliminare la tabella.

versione leggermente più generico di quello che @mark_s postato, questo mi ha aiutato

SELECT 
'ALTER TABLE ' +  OBJECT_SCHEMA_NAME(k.parent_object_id) +
'.[' + OBJECT_NAME(k.parent_object_id) + 
'] DROP CONSTRAINT ' + k.name
FROM sys.foreign_keys k
WHERE referenced_object_id = object_id('your table')

si deve inserire la nome della tabella, ed eseguire il risultato di essa.

Ecco un altro modo per farlo eliminare tutti i vincoli seguiti dalle tabelle stesse, utilizzando un trucco concatenazione coinvolge FOR XML PATH('') che permette l'unione di più righe di input in un'unica riga di output. Dovrebbe funzionare su qualsiasi cosa SQL 2005 e in seguito.

Ho lasciato i comandi vengono eseguiti commentati per la sicurezza.

DECLARE @SQL NVARCHAR(max)
;WITH fkeys AS (
    SELECT quotename(s.name) + '.' + quotename(o.name) tablename, quotename(fk.name) constraintname 
    FROM sys.foreign_keys fk
    JOIN sys.objects o ON fk.parent_object_id = o.object_id
    JOIN sys.schemas s ON o.schema_id = s.schema_id
)
SELECT @SQL = STUFF((SELECT '; ALTER TABLE ' + tablename + ' DROP CONSTRAINT ' + constraintname
FROM fkeys
FOR XML PATH('')),1,2,'')

-- EXECUTE(@sql)

SELECT @SQL = STUFF((SELECT '; DROP TABLE ' + quotename(TABLE_SCHEMA) + '.' + quotename(TABLE_NAME) 
FROM INFORMATION_SCHEMA.TABLES 
FOR XML PATH('')),1,2,'')

-- EXECUTE(@sql)

Ecco uno script completo per implementare una soluzione:

create Procedure [dev].DeleteTablesFromSchema
(
    @schemaName varchar(500)
)
As 
begin
    declare @constraintSchemaName nvarchar(128), @constraintTableName nvarchar(128),  @constraintName nvarchar(128)
    declare @sql nvarchar(max)
    -- delete FK first
    declare cur1 cursor for
    select distinct 
    CASE WHEN t2.[object_id] is NOT NULL  THEN  s2.name ELSE s.name END as SchemaName,
    CASE WHEN t2.[object_id] is NOT NULL  THEN  t2.name ELSE t.name END as TableName,
    CASE WHEN t2.[object_id] is NOT NULL  THEN  OBJECT_NAME(d2.constraint_object_id) ELSE OBJECT_NAME(d.constraint_object_id) END as ConstraintName
    from sys.objects t 
        inner join sys.schemas s 
            on t.[schema_id] = s.[schema_id]
        left join sys.foreign_key_columns d 
            on  d.parent_object_id = t.[object_id]
        left join sys.foreign_key_columns d2 
            on  d2.referenced_object_id = t.[object_id]
        inner join sys.objects t2 
            on  d2.parent_object_id = t2.[object_id]
        inner join sys.schemas s2 
            on  t2.[schema_id] = s2.[schema_id]
    WHERE t.[type]='U' 
        AND t2.[type]='U'
        AND t.is_ms_shipped = 0 
        AND t2.is_ms_shipped = 0 
        AND s.Name=@schemaName
    open cur1
    fetch next from cur1 into @constraintSchemaName, @constraintTableName, @constraintName
    while @@fetch_status = 0
    BEGIN
        set @sql ='ALTER TABLE ' + @constraintSchemaName + '.' + @constraintTableName+' DROP CONSTRAINT '+@constraintName+';'
        exec(@sql)
        fetch next from cur1 into @constraintSchemaName, @constraintTableName, @constraintName
    END
    close cur1
    deallocate cur1

    DECLARE @tableName nvarchar(128)
    declare cur2 cursor for
    select s.Name, p.Name
    from sys.objects p
        INNER JOIN sys.schemas s ON p.[schema_id] = s.[schema_id]
    WHERE p.[type]='U' and is_ms_shipped = 0 
    AND s.Name=@schemaName
    ORDER BY s.Name, p.Name
    open cur2

    fetch next from cur2 into @schemaName,@tableName
    while @@fetch_status = 0
    begin
        set @sql ='DROP TABLE ' + @schemaName + '.' + @tableName
        exec(@sql)
        fetch next from cur2 into @schemaName,@tableName
    end

    close cur2
    deallocate cur2

end
go
Removing Referenced FOREIGN KEY Constraints
Assuming there is a parent and child table Relationship in SQL Server:

--First find the name of the Foreign Key Constraint:
  SELECT * 
  FROM sys.foreign_keys
  WHERE referenced_object_id = object_id('States')

--Then Find foreign keys referencing to dbo.Parent(States) table:
   SELECT name AS 'Foreign Key Constraint Name', 
           OBJECT_SCHEMA_NAME(parent_object_id) + '.' + OBJECT_NAME(parent_object_id) AS 'Child Table'
   FROM sys.foreign_keys 
   WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = 'dbo' AND 
              OBJECT_NAME(referenced_object_id) = 'dbo.State'

 -- Drop the foreign key constraint by its name 
   ALTER TABLE dbo.cities DROP CONSTRAINT FK__cities__state__6442E2C9;

 -- You can also use the following T-SQL script to automatically find 
 --and drop all foreign key constraints referencing to the specified parent 
 -- table:

 BEGIN

DECLARE @stmt VARCHAR(300);

-- Cursor to generate ALTER TABLE DROP CONSTRAINT statements  
 DECLARE cur CURSOR FOR
 SELECT 'ALTER TABLE ' + OBJECT_SCHEMA_NAME(parent_object_id) + '.' + 
 OBJECT_NAME(parent_object_id) +
                ' DROP CONSTRAINT ' + name
 FROM sys.foreign_keys 
 WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = 'dbo' AND 
            OBJECT_NAME(referenced_object_id) = 'states';

 OPEN cur;
 FETCH cur INTO @stmt;

 -- Drop each found foreign key constraint 
  WHILE @@FETCH_STATUS = 0
  BEGIN
    EXEC (@stmt);
    FETCH cur INTO @stmt;
  END

  CLOSE cur;
  DEALLOCATE cur;

  END
  GO

--Now you can drop the parent table:

 DROP TABLE states;
--# Command(s) completed successfully.

Utilizzo di SQL Server Manager è possibile eliminare i vincoli di chiave dall'interfaccia utente. Se si desidera eliminare la Diary tavolo, ma il tavolo utente ha una DiaryId chiave esterna che punta alla tabella di Diary, è possibile espandere (usando il simbolo più) la tabella User e quindi espandere la sezione Foreign Keys. Fare clic destro sulla chiave esterna che punta alla tabella diario quindi selezionare Delete. È quindi possibile espandere la sezione Columns, fare clic destro e eliminare la colonna di DiaryId troppo. Poi si può semplicemente eseguire:

drop table Diary

So che la tua domanda reale è di circa l'eliminazione di tutte le tabelle, quindi questo non può essere un utile per quel caso. Tuttavia, se si desidera solo eliminare alcuni tavoli che questo sia utile Credo che (il titolo non esplicitamente menzionato l'eliminazione di tutte le tabelle).

Se siete su un server MySQL e se non ti dispiace perdere le tabelle, è possibile utilizzare una semplice query per eliminare più tavoli contemporaneamente:

SET foreign_key_checks = 0;
DROP TABLE IF EXISTS table_a,table_b,table_c,table_etc;
SET foreign_key_checks = 1;

In questo modo, non importa in quale ordine si utilizza il tavolo si esegue una query.

Se qualcuno sta per dire qualcosa sul fatto che questa non è una buona soluzione se si dispone di un database con molti tavoli: Sono d'accordo

  

Se voglio eliminare tutte le tabelle in   mio database

Allora è molto più facile far cadere l'intero database:

DROP DATABASE WorkerPensions

Se si vuole DROP un tavolo che è stato fatto riferimento da un altro tavolo con l'estero uso chiave

DROP TABLE *table_name* CASCADE CONSTRAINTS;
Penso che dovrebbe funzionare per voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top