Frage

Wenn ich alle Tabellen in meiner Datenbank wie diese löschen wollen, wird es kümmern sich um die Fremdschlüssel? Wenn nicht, wie zu tun pflege ich, dass zuerst?

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]
War es hilfreich?

Lösung

Nein, dies wird Ihre Tabelle nicht fallen, wenn es in der Tat Fremdschlüssel verweist es.

Um alle Fremdschlüsselbeziehungen Ihrer Tabelle verweisen, könnten Sie diese SQL verwenden (wenn Sie auf SQL Server 2005 sind und nach oben):

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

und wenn es welche gibt, mit dieser Aussage hier, können Sie SQL-Anweisungen erstellen, um tatsächlich diese FK Beziehungen fallen:

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')

Andere Tipps

In SQL Server Management Studio 2008 (R2) und neuere, können Sie einen Rechtsklick auf die Schaltfläche

  

DB -> Aufgaben -> Generieren Scripts

  • Wählen Sie die Tabellen, die Sie löschen möchten.

  • Wählen Sie "Speichern In den neuen Abfragefenster".

  • Klicken Sie auf die Schaltfläche Erweitert.

  • Set Script DROP und CREATE Script DROP.

  • Set Script Fremdschlüssel auf True fest.

  • Klicken Sie auf OK.

  • Klicken Sie auf Weiter -> Weiter -.> Fertig stellen

  • Sehen Sie das Skript und dann ausführen.

Wenn Sie das „Kind“ Tabelle zuerst fallen, wird der Fremdschlüssel als auch fallen gelassen werden. Wenn Sie die „Eltern“ Tabelle zuerst löschen versuchen, erhalten Sie ein „Objekt kann nicht‚a‘fallen, weil sie durch eine FOREIGN KEY-Einschränkung verwiesen wird.“ Fehler.

Hier ist eine weitere Möglichkeit, alle Tabellen richtig fallen zu lassen, sp_MSdropconstraints Verfahren. Der kürzeste Code, den ich denken kann:

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

Wenn es SQL Server ist, müssen Sie die Einschränkung löschen, bevor Sie die Tabelle löschen können.

Etwas mehr generische Version von dem, was geschrieben @mark_s, das hat mir geholfen,

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')

einfach schließen Sie Ihren Tabellennamen, und führen Sie das Ergebnis davon.

Hier ist eine andere Art und Weise die Einschränkungen alle durch die Tabellen selbst gefolgt zu tun löschen, eine Verkettung Trick FOR XML PATH('') beteiligt, die mehrere Eingabezeilen in einer einzigen Ausgabezeile ermöglicht verschmelzen. Sollte auf etwas SQL 2005 arbeiten und später.

Ich habe die Befehle für die Sicherheit auf Kommentar EXECUTE links.

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)

Dies ist die komplette Skript eine Lösung zu implementieren:

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.

Verwenden von SQL Server-Manager können Sie für Fremdschlüssel von der Benutzeroberfläche fallen kann. Wenn Sie die Tabelle Diary aber die Benutzertabelle einen Fremdschlüssel DiaryId hat löschen möchten die Diary Tabelle zeigt, können Sie erweitern (mit dem Plus-Symbol), um die User Tabelle und dann den Foreign Keys Abschnitt erweitern. Rechtsklick auf dem Fremdschlüssel, der auf die Tagebuch-Tabelle dann Delete wählen. Sie können dann den Columns Abschnitt erweitern, rechts klicken und die Spalte DiaryId löschen. Dann können Sie einfach laufen:

drop table Diary

Ich weiß, dass Ihre eigentliche Frage ist über alle Tabellen zu löschen, so kann dies keine nützlich für diesen Fall sein. Allerdings, wenn Sie nur ein paar Tabellen dies ist nützlich, löschen möchte ich glaube, (der Titel nicht explizit erwähnen alle Tabellen zu löschen).

Wenn Sie auf einem MySQL-Server sind und wenn Sie nichts dagegen haben, Ihre Tabellen zu verlieren, können Sie eine einfache Abfrage verwenden, um mehrere Tabellen auf einmal zu löschen:

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

Auf diese Weise ist es egal, in welcher Reihenfolge Sie die Tabelle verwenden, in Query.

Wenn jemand geht, etwas über die Tatsache sagen, dass dies keine gute Lösung, wenn Sie eine Datenbank mit vielen Tabellen haben: Ich bin damit einverstanden

  

Wenn ich alle Tabellen löschen möchten in   meine Datenbank

Dann ist es viel einfacher, die gesamte Datenbank zu löschen:

DROP DATABASE WorkerPensions

Wenn Sie eine Tabelle DROP, die von anderer Tabelle verwiesen wurde, um den Fremdschlüssel Verwendung mit

DROP TABLE *table_name* CASCADE CONSTRAINTS;
Ich denke, es sollte für Sie arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top