如何在SQL SERVER 2014中按正确顺序删除表?

我有以下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新手。 在此先感谢!

回答:

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的东西,它可能会更容易,如果它的工作。

回答:

如果您有疑问,并且不想因某种原因删除您的约束条件,则可以始终使用以与创建它们相反的顺序放置您的表格。

由于第一表不引用任何其他的,但也许是由后创建的其他表格中引用的,应该将其删除最后

对于其余表格,应用相同的逻辑。其余表中的第一个将被最后删除,等等。

回答:

你可以首先通过删除所有FK约束:

ALTER TABLE ... DROP CONSTRAINT ...; 

然后滴在任何顺序表。


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

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

DBFiddle Demo

回答:

这里是我平时做的方式:

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的实例,但我用这样的代码上面所有的时间。)

以上是 如何在SQL SERVER 2014中按正确顺序删除表? 的全部内容, 来源链接: utcz.com/qa/258049.html

回到顶部