SQL DROP TABLE外国主要制约因素
-
21-09-2019 - |
题
如果我想要删除所有表在我的数据库,这样,它将需要护理的外键约束?如果不是,我怎么照顾,第一?
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]
解决方案
没有,这不会,如果确有外键引用它放下你的表。
要获得所有的外键关系引用表,那么您可以使用此SQL(如果你的SQL Server 2005及以上):
SELECT *
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')
,如果有的话,这个说法在这里,您可以创建SQL语句实际下降的FK关系:
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')
其他提示
在SQL服务器的管理工作室2008(R2)和更新,您可以正确的点击
DB->的任务-->产生的脚本
选择表你想要降。
选择"存到新的查询窗口"。
点击"高级"按钮.
设置脚本下降,并创造到脚本下降。
设置脚本外键真实的。
点击"确定"。
点击次>下->完成。
看剧本,然后执行。
如果您先删除“子”表,外键将被丢弃,以及。如果尝试先删除“父”表,你会得到一个“因为它是由一个外键约束引用无法删除对象‘一’。”错误。
下面是另一种方式来正确地丢弃所有表,使用sp_MSdropconstraints
过程。我能想到的最简短的代码:
exec sp_MSforeachtable "declare @name nvarchar(max); set @name = parsename('?', 1); exec sp_MSdropconstraints @name";
exec sp_MSforeachtable "drop table ?";
如果它是SQL服务器,您必须删除约束,然后才能删除该表。
这是什么@mark_s贴稍微更宽泛的版本,这帮助我
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')
只要插上你的表名,然后执行它的结果。
下面是另一种方法做删除所有约束随后表本身,使用涉及FOR XML PATH('')
允许合并多个输入行成一个单一的输出行的级联特技。应该在什么SQL 2005及更高版本。
我已经离开注释出于安全的执行命令。
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)
下面是实现解决方案的完整脚本:
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.
使用SQL Server Manager,您可以从UI删除外键约束。如果你想删除表Diary
但用户表具有指向DiaryId
表的外键Diary
,可以扩展(使用加号)的User
表,然后展开Foreign Keys
部分。右击外键指向日记表,然后选择Delete
。然后,您可以展开Columns
部分,右键单击并删除列DiaryId
了。然后,你可以运行:
drop table Diary
我知道你的实际问题是关于删除所有的表,所以这可能不是这种情况下有用的。但是,如果你只是想删除几桌,这是有用的,我相信(本题没有明确提到删除所有表)。
如果你是一个MySQL服务器上,如果你不介意失去你的表,你可以使用一个简单的查询一次删除多个表:
SET foreign_key_checks = 0;
DROP TABLE IF EXISTS table_a,table_b,table_c,table_etc;
SET foreign_key_checks = 1;
在这种方式并不重要什么顺序使用表中你查询。
如果有任何人会说一些有关的事实,这是不是一个很好的解决方案,如果你有很多表的数据库:我同意
如果我想删除所有表 我的数据库
然后,它是一个更容易下降整个数据库:
DROP DATABASE WorkerPensions
如果你想使用外键使用,以DROP
已被其他表所引用的表点击
DROP TABLE *table_name* CASCADE CONSTRAINTS;
结果
我认为它应该为你工作。