2013-02-27 98 views
12

我有以下几点:如何在SQL Server中存在外键约束的情况下删除表?

DROP TABLE [dbo].[ExtraUserInformation]; 
DROP TABLE [dbo].[UserProfile]; 
DROP TABLE [dbo].[webpages_Membership]; 
DROP TABLE [dbo].[webpages_OAuthMembership]; 
DROP TABLE [dbo].[webpages_Roles]; 
DROP TABLE [dbo].[webpages_UsersInRoles]; 

CREATE TABLE [dbo].[ExtraUserInformation] (
    [Id]  INT   IDENTITY (1, 1) NOT NULL, 
    [UserId] INT   NOT NULL, 
    [FullName] NVARCHAR (MAX) NULL, 
    [Link]  NVARCHAR (MAX) NULL, 
    [Verified] BIT   NULL, 
    CONSTRAINT [PK_dbo.ExtraUserInformation] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

CREATE TABLE [dbo].[webpages_UsersInRoles] (
    [UserId] INT NOT NULL, 
    [RoleId] INT NOT NULL, 
    PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC), 
    CONSTRAINT [fk_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[UserProfile] ([UserId]), 
    CONSTRAINT [fk_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[webpages_Roles] ([RoleId]) 
); 

然而,这与消息未能说:

Msg 3726, Level 16, State 1, Line 6 
Could not drop object 'dbo.UserProfile' because it is referenced by a FOREIGN KEY constraint. 
Msg 3726, Level 16, State 1, Line 9 
Could not drop object 'dbo.webpages_Roles' because it is referenced by a FOREIGN KEY constraint. 
Msg 2714, Level 16, State 6, Line 27 
There is already an object named 'UserProfile' in the database. 
Checking identity information: current identity value 'NULL', current column value 'NULL'. 
DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

我怎么能在这种情况下删除表?

+0

下降引用 – Sergio 2013-02-27 08:25:16

+0

看看这个问题:http://stackoverflow.com/questions/1776079/sql-drop-table-foreign-key-constraint 这是一个常见的SQL Server任务 – MPH 2013-02-27 08:26:39

+0

你必须删除CONSTRAINS – 2013-02-27 08:26:59

回答

4

1,先删除外键约束,然后删除表。

2,您可以通过执行以下查询删除所有外键:

DECLARE @SQL varchar(4000)='' 
SELECT @SQL = 
@SQL + 'ALTER TABLE ' + s.name+'.'+t.name + ' DROP CONSTRAINT [' + RTRIM(f.name) +'];' + CHAR(13) 
FROM sys.Tables t 
INNER JOIN sys.foreign_keys f ON f.parent_object_id = t.object_id 
INNER JOIN sys.schemas  s ON s.schema_id = f.schema_id 

--EXEC (@SQL) 

PRINT @SQL 

如果执行打印结果@SQL,外键将被丢弃。

3

最佳答案滴加含有异物约束表是:

  • 步骤1:删除表中的主键。
  • 第2步:现在它会提示是否删除所有外部引用。
  • 步骤3:删除表格。
-1

要在MySQL服务器中存在外键约束时删除表吗?

运行SQL查询:

SET FOREIGN_KEY_CHECKS = 0; DROP TABLE table_name

希望它有帮助!

+1

问题是关于Microsoft SQL Server不是MySQL – 2015-01-05 19:40:07

+0

解决了我的问题。 – 2015-12-29 15:06:30

1

BhupeshC and murat,这就是我一直在寻找的东西。但@SQL varchar(4000)不够大。因此,小的变化

DECLARE @cmd varchar(4000) 

DECLARE MY_CURSOR CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY 
FOR 

select 'ALTER TABLE ['+s.name+'].['+t.name+'] DROP CONSTRAINT [' + RTRIM(f.name) +'];' FROM sys.Tables t INNER JOIN sys.foreign_keys f ON f.parent_object_id = t.object_id INNER JOIN sys.schemas s ON s.schema_id = f.schema_id 

OPEN MY_CURSOR 
FETCH NEXT FROM MY_CURSOR INTO @cmd 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    -- EXEC (@cmd) 
    PRINT @cmd 
    FETCH NEXT FROM MY_CURSOR INTO @cmd 
END 
CLOSE MY_CURSOR 
DEALLOCATE MY_CURSOR 

GO 
2

你必须在删除表之前删除约束。

您可以使用这些查询来查找表中的所有FK,并在使用您的表的表中找到FK。

Declare @SchemaName VarChar(200) = 'Your Schema name' 
Declare @TableName VarChar(200) = 'Your Table Name' 

-- Find FK in This table. 
SELECT 
    ' IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = 
OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']' 
+ ''') AND parent_object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + 
OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' + 

    'ALTER TABLE ' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + 
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name 
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id) 
FROM sys.foreign_keys AS FK 
INNER JOIN Sys.objects As O 
    ON (O.object_id = FK.parent_object_id) 
INNER JOIN SYS.schemas AS S 
    ON (O.schema_id = S.schema_id) 
WHERE 
     O.name = @TableName 
     And S.name = @SchemaName 


-- Find the FKs in the tables in which this table is used 
    SELECT 
    ' IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = 
     OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']' 
    + ''') AND parent_object_id = OBJECT_ID(N''' + 
     '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + 
OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' + 

    ' ALTER TABLE ' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + 
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name 
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id) 
FROM sys.foreign_keys AS FK 
INNER JOIN Sys.objects As O 
    ON (O.object_id = FK.referenced_object_id) 
INNER JOIN SYS.schemas AS S 
    ON (O.schema_id = S.schema_id) 
WHERE 
     O.name = @TableName 
     And S.name = @SchemaName 
+0

卓越的程序! – raBinn 2017-02-07 17:20:16