2017-12-02 1 views
0

Ich habe folgende 5 Tabellen und 1 Tabelle ist als Fremdschlüssel in 2 Tabellen verbunden. Mein Dilemma ist, dass ich nicht herausfinden kann, welche Tabelle zuerst fallen soll. unten ist der Code drop table ich versuche und ich habe Tabellen in folgenden ReihenfolgeWie Tabelle in der richtigen Reihenfolge in SQL SERVER 2014 ablegen?

Aktualisiert Drop Table-Code erstellt:

IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='[Student Major]') 
    BEGIN 
     DROP TABLE [Student Major] 
    END 
    GO 
    IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Major') 
    BEGIN 
     DROP TABLE Major 
    END 
    GO 
    IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Citizenship') 
    BEGIN 
     DROP TABLE Citizenship 
    END 
    GO 
    IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Country') 
    BEGIN 
     DROP TABLE Country 
    END 
    IF EXISTS (SELECT*FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Student') 
    BEGIN 
     DROP TABLE Student 
    END 
    GO 

CREATE TABLE Student(
    [Student ID] INT IDENTITY PRIMARY KEY 
    ,[First Name] varchar (50) NOT NULL 
    ,[Last Name] varchar (30) NOT NULL 
    ) 
GO 

CREATE TABLE Country(
    [Country ID] int identity PRIMARY KEY NOT NULL 
    ,[Country of Birth] varchar (10) 
    ,[Student ID] int FOREIGN KEY REFERENCES Student([Student ID]) NOT NULL 
    ) 
GO 

CREATE TABLE Citizenship(
    [Citizenship ID] int identity PRIMARY KEY 
    ,[Country of Citizenship1] varchar (10) 
    ,[Country of Citizenship2] varchar (10) 
    ,[Student ID] int FOREIGN KEY REFERENCES Student([Student ID]) NOT NULL 
    ,[Country ID] int FOREIGN KEY REFERENCES Country([Country ID]) NOT NULL 
    ) 
GO 
CREATE TABLE Major(
    [Major ID] int identity PRIMARY KEY 
    ,[Major Name] varchar(30) NOT NULL 
    ) 
GO 

CREATE TABLE [Student Major](
    [Student MajorID] int identity 
    ,[Student ID] int FOREIGN KEY REFERENCES Student([Student ID]) 
    ,[Major ID] int FOREIGN KEY REFERENCES Major([Major ID]) 
    ,[Graduated Major] varchar (30) NOT NULL 
    ) 
GO 

Ich mag Tisch fallen würde korrekte Bestellung

Fehler: Konntennr t das Objekt 'Student' ablegen, da es von einer FOREIGN KEY-Einschränkung referenziert wird. Geben Sie auch eine Erklärung zum Löschen der Tabelle an. Ich bin neu in SQL. Vielen Dank im Voraus!

+1

Separat Ihre Daten Modell ist insofern fehlerhaft, als es nur einen Studenten pro Land erlaubt. Sie sollten CountryID wahrscheinlich als Fremdschlüssel für Country in die Student-Tabelle aufnehmen und StudentID aus Country entfernen. –

Antwort

0
DROP TABLE Student_Major; GO 
    SELECT 1 FROM Citizenship; GO 
DROP TABLE Citizenship; GO 
    SELECT 1 FROM Major; GO 
DROP TABLE Major; GO 
    SELECT 1 FROM Country; GO 
DROP TABLE Country; GO 
    SELECT 1 FROM Student; GO 
DROP TABLE Student; GO 

Es ist genau wie du gesagt hast, es muss in der Reihenfolge sein, so dass jede Tabelle, die von einem FK referenziert wird, nicht fallen gelassen wird ped, solange der FK da ist.

EDIT: GO Kräfte das Ende der Partie

EDIT: Ich merke, Sie GO haben dort bereits. Sie könnten Information_schema verwenden, um die mit der Tabelle verbundenen Einschränkungen zu finden und sie zuerst zu löschen, aber ich denke, Sie sollten das nicht tun müssen. Was passiert, wenn Sie eine Dummy-Abfrage zwischen jeder DROP-Anweisung injizieren. Es ist hacky, aber wenn du nicht das ganze information_schama-Zeug verstehen willst, könnte es einfacher sein, wenn es funktioniert.

+0

Ich habe oben im Abschnitt" Aktualisierter Drop-Tabellenabschnitt "versucht, mir immer noch eine Fehlermeldung zu geben 3726, Ebene 16, Status 1, Zeile 59 Das Objekt 'Major' konnte nicht gelöscht werden, da es durch eine FOREIGN KEY-Einschränkung referenziert wird. Msg 3726, Ebene 16, Status 1, Zeile 73 Konnte das Objekt 'Student' nicht löschen, da es durch eine FOREIGN KEY-Einschränkung referenziert wird "Jeder Vorschlag könnte der Grund sein? – biggboss2019

+0

Eigentlich würde ich nur mit Rodricks Antwort gehen –

+0

Ich stimme mit Ihnen überein Kommentar, Aber ich weiß nicht die Reihenfolge, die ich verwenden kann Ich versuchte, die Reihenfolge umzukehren, aber nicht funktioniert Vielen Dank im Voraus! – biggboss2019

0

Wenn Sie Zweifel haben, und Ihre Einschränkungen aus irgendeinem Grund nicht entfernen möchten, können Sie immer Ihre Tabellen in der genau umgekehrten Reihenfolge fallen lassen, in der Sie sie erstellten.

Da die erste Tabelle andere nicht verweisen nicht, aber vielleicht von anderen Tabellen, nachdem es erstellt verwiesen wird, sollten Sie es letzte löschen.

Für die restlichen Tabellen dieselbe Logik anwenden. Die erste der verbleibenden Tabellen wird zuletzt unter ihnen gelöscht, und so weiter.

+0

Ich habe versucht, den oben genannten "aktualisierte Drop-Tabelle" -Code und es gibt immer noch eine Fehlermeldung "Msg 3726, Ebene 16, Zustand 1, Linie 59 Konnte Objekt 'Major' nicht fallen lassen, weil es von einer FOREIGN KEY-Einschränkung referenziert wird. Msg 3726, Ebene 16, Status 1, Zeile 73 Konnte das Objekt 'Student' nicht löschen, da es durch eine FOREIGN KEY-Einschränkung referenziert wurde. " – biggboss2019

1

Sie können zunächst alle FK Einschränkungen entfernen:

ALTER TABLE ... DROP CONSTRAINT ...; 

dann in beliebiger Reihenfolge Tabellen löschen.


Wenn Sie mit SQL Server 2016 und über Sie DIE (Drop falls vorhanden) und mehrere Tabellen at-once (noch bestellen Angelegenheiten) verwenden:

DROP TABLE IF EXISTS [Student Major], Major, Citizenship, Country,Student; 

DBFiddle Demo

1

Hier wird die Art und Weise ist, dass ich es normalerweise tun:

select 'alter table ' + O.name + ' drop ' + F.name from sys.objects O 
    inner join sys.foreign_keys F on F.parent_object_id = O.object_id 

where O.type = 'U' 


select 'drop table ' + name from sys.objects where type = 'U' order by create_date desc 

Dies wird ein Datensatz wie

alter table Foo drop FK_BLAH 
alter table Bar drop FK_BAH 

... 

drop table Foo 
drop table Bar 

Welche generieren, können Sie dann in ein Abfragefenster einfach kopieren und einfügen, und lauf von dort.

(Zu der Zeit, dass ich diese Antwort ich schreibe, ich habe keinen Zugriff auf eine Instanz von SQL Server, aber ich benutze Code wie das vor allem Zeit.)

+0

Nur schnelle Frage.Wie würde ich Finden Sie die Reihenfolge meiner Tabellen? Ich kann sehen, dass über Code generierte 2. Codes von Ihnen präsentiert. – biggboss2019

+0

@ biggboss2019 - Ich fügte eine "Order by create_date desc" -Klausel in die Abfrage für das Löschen von Tabellen. Das sollte sie sortieren Umkehrung der Reihenfolge, in der Sie sie erstellt haben. –