如何在SQL Server中删除外键约束?

82

我希望从另一张表中删除外键,以便插入我想要的值。

由于我在数据库方面很新,请告诉我正确的SQL查询语句来删除或移除外键值。


3
可能是如何在SQL Server中删除外键?的重复问题。 - Liam
15个回答

175

1
我没有添加任何约束名称。我该如何删除该约束? - Abhishek Goel
1
即使您不指定约束名称,SQL Server也会分配一个唯一的约束名称。您可以使用SQL Management Studio查找该名称。 - Edward Olamisan
3
楼主明确表示平台是 MS SQL Server,而不是 PostgreSQL(标签和问题标题)。 - Alexandre

15

涉及到参照完整性的情况下这样做是错误的,因为一旦破坏了它,重新启用它就不容易了,必须通过删除违反约束条件的记录来重新建立。

语法如下:

ALTER TABLE Tablename DROP CONSTRAINT ContName;

参见MSDN:


不,SQL Server 中删除外键和主键的语法是相同的:alter table <tablename> drop constraint <fk_or_pk_name>。 - demoncodemonkey
@demoncodemonkey ContName或<fk_or_pk_name>应该是现有表中的列名或原始表中我们在当前表中使用作为外键的列名? - iatharva
@iatharva 这是约束的名称 - 例如 PK_Users_Id 或 FK_Users_Id 等。您可以使用 SELECT name FROM sys.foreign_keys 查看数据库中的所有外键。祝你好运! - demoncodemonkey

6
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]

但是,要小心,一旦你这样做了,你可能再也没有机会了,你应该阅读一些基础的数据库书籍,看看为什么我们需要外键。


1
只要参照完整性还在,他可以再次添加约束(constraint)以恢复其功能。如果参照完整性已经被破坏,则必须先修复它。 - Tobberoth
@Tobberoth,是的,那就是我想表达的意思,谢谢你澄清了。在现实世界中,大部分时间其他开发人员会弄乱表中的数据,而由于这些数据存在,你无法重新添加约束条件。 - Simon Wang

5

要从数据库中删除所有约束:

SELECT 'ALTER TABLE ' + Table_Name  +' DROP CONSTRAINT ' + Constraint_Name
FROM Information_Schema.CONSTRAINT_TABLE_USAGE

3

在您完全删除约束之前,请考虑(暂时)禁用约束。

如果您查看表创建TSQL,您将看到以下内容:

ALTER TABLE [dbo].[dbAccounting] CHECK CONSTRAINT [FK_some_FK_constraint]

你可以运行。
ALTER TABLE [dbo].[dbAccounting] NOCHECK CONSTRAINT [FK_some_FK_constraint]

...然后插入/更新一些违反约束的值,然后通过运行原始的CHECK语句来重新启用它。

(过去我曾经不得不这样做来清理我继承的糟糕设计的系统。)


3

删除表中的所有外键:

USE [Database_Name]
DECLARE @FOREIGN_KEY_NAME VARCHAR(100)

DECLARE FOREIGN_KEY_CURSOR CURSOR FOR
SELECT name FOREIGN_KEY_NAME FROM sys.foreign_keys WHERE parent_object_id = (SELECT object_id FROM sys.objects WHERE name = 'Table_Name' AND TYPE = 'U')

OPEN FOREIGN_KEY_CURSOR
----------------------------------------------------------
FETCH NEXT FROM FOREIGN_KEY_CURSOR INTO @FOREIGN_KEY_NAME
WHILE @@FETCH_STATUS = 0
    BEGIN
       DECLARE @DROP_COMMAND NVARCHAR(150) = 'ALTER TABLE Table_Name DROP CONSTRAINT' + ' ' + @FOREIGN_KEY_NAME

       EXECUTE Sp_executesql @DROP_COMMAND

       FETCH NEXT FROM FOREIGN_KEY_CURSOR INTO @FOREIGN_KEY_NAME

    END
-----------------------------------------------------------------------------------------------------------------
CLOSE FOREIGN_KEY_CURSOR
DEALLOCATE FOREIGN_KEY_CURSOR

1
你错了,应该使用 parent_object_id 而不是 referenced_object_id - udoline

2

根据你所使用的数据库,语法可能有所不同。

如果你正在使用Oracle,你需要按照其他用户告诉你的方式进行操作:

ALTER TABLE table_name DROP CONSTRAINT fk_name;

但是如果你使用的是MySQL,那么这将会给你一个语法错误,相反地,你可以输入:

ALTER TABLE table_name DROP INDEX fk_name;

2

首先使用

show create table table_name;

查看您的表的描述结构。

在那里,您可以查看与该表中使用的外键相关的约束条件。 首先使用

删除相应的约束条件。
alter table table_name drop constraint constraint_name;

然后删除你想要的相应外键或列...祝你好运!


1
使用这些查询找到所有的外键(FKs):
Declare @SchemaName VarChar(200) = 'Schema Name'
Declare @TableName VarChar(200) = '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 

1

另外,您还可以从SQL Server Management Studio中删除外键约束。 如果命令不起作用,您可以尝试一下

  1. 展开数据库视图。
  2. 右键单击具有外键约束的表。选择设计。将打开一个包含有关表列信息的选项卡。
  3. 右键单击具有外键引用的列。或者您可以右键单击任何列。选择关系。
  4. 将显示关系列表(如果您有一个)在弹出窗口中。
  5. 从那里您可以删除外键约束。

希望这有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接