如何在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