2017-12-02 106 views
0

我有以下5個表和1表作爲外鍵連接在2個表中。我的困境是,我無法弄清楚哪張桌子先掉落。下面是我想刪除表的代碼,我已經按照以下順序如何在SQL SERVER 2014中按正確順序刪除表?

更新刪除表的代碼創建的表:

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 

我想刪除表中正確的順序

錯誤: 可能無t放下對象'學生',因爲它被FOREIGN KEY約束引用。 另外,請提供丟棄表的解釋。我是SQL新手。 在此先感謝!

+1

另外,您的數據模型有缺陷,因爲它只允許每個國家的一名學生。您應該將CountryID作爲Country的外鍵添加到Student表中,並從Country刪除StudentID。 –

回答

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 

就像你說的那樣,它必須按順序排列,以便任何由FK引用的表都不會丟失只要FK在那裏。

編輯:GO力量批次結束

編輯:我注意到你在那裏已經有GO。您可以使用Information_schema查找與表關聯的約束並首先將其放下,但我覺得您不需要這樣做。如果您在每個DROP聲明之間注入虛擬查詢,該怎麼辦?這很冒險,但如果你不想理解所有的information_schema的東西,它可能會更容易,如果它的工作。

+0

我在上面的代碼中更新了Drop table部分,它仍然給我一個錯誤Msg 3726,級別16,狀態1,行59無法刪除對象'Major',因爲它由FOREIGN KEY約束引用。消息3726,級別16,狀態1,行73無法刪除對象的'學生',因爲它被一個外鍵約束引用「任何建議可能是什麼原因? – biggboss2019

+0

其實我只想去與羅德里克的答案 –

+0

我同意智慧評論,但我不知道我可以使用的順序我試着顛倒了順序,但沒有工作。提前致謝! – biggboss2019

0

如果您有疑問,並且不想因某種原因刪除您的約束條件,則可以始終使用以與創建它們相反的順序放置您的表格

由於第一表不引用任何其他的,但也許是由後創建的其他表格中引用的,應該將其刪除最後

對於其餘表格,應用相同的邏輯。其餘表中的第一個將被最後刪除,等等。

+0

我試過上面的「更新下拉表」代碼,它仍然給我一個錯誤,說:「消息3726,級別16,狀態1,行59 無法刪除對象'主要',因爲它是由FOREIGN KEY約束引用的。 Msg 3726,Level 16,State 1,Line 73 因爲它被一個FOREIGN KEY約束引用而無法刪除對象'Student' – biggboss2019

1

你可以首先通過刪除所有FK約束:

ALTER TABLE ... DROP CONSTRAINT ...; 

然後滴在任何順序表。


如果您正在使用SQL Server 2016以上可以使用DIE(跌落如果存在)和多個表一次(仍能訂購事宜):

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

DBFiddle Demo

1

這裏是我平時做的方式:

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 

這將生成設置如

alter table Foo drop FK_BLAH 
alter table Bar drop FK_BAH 

... 

drop table Foo 
drop table Bar 

其中,然後你可以複製並粘貼到一個查詢窗口的記錄,並從那裏跑。

(當時我在寫這個答案的時候,我沒有訪問SQL Server的實例,但我用這樣的代碼上面所有的時間。)

+0

只是快速的問題。找到我的表的順序?我可以看到上面的代碼生成第二個代碼由你提供 – biggboss2019

+0

@ biggboss2019 - 我添加了一個「'order by create_date desc'」子句來查詢丟表,它應該將它們排序與您創建它們的順序相反。 –