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


Answers:


150

尝试跟随

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

请参阅:http : //www.w3schools.com/sql/sql_foreignkey.asp


1
我没有添加任何约束名称。如何删除该约束?
Abhishek Goel 2013年

1
即使您未指定约束名称,SQL Server也会分配一个唯一的约束名称。您可以使用SQL Management Studio查找名称。
爱德华·奥拉米桑

当然,您也可以通过在postgres命令行客户端中键入\ d table_name来找到约束的名称。通常看起来像“ fk .......”
Nytux

2
@Nytux OP明确指出该平台是MS SQL Server,而不是PostgreSQL(标签和问题标题)。
亚历山德拉

12

引用完整性方面做到这一点是错误的,因为一旦它损坏了,就很难再次打开它,而不必遍历记录并删除破坏约束的记录。

无论如何,语法如下:

ALTER TABLE Tablename DROP CONSTRAINT ContName;

请参阅MSDN:


不,SQL Server中用于删除外键和主键的语法是相同的:alter table <表名>删除约束<fk_or_pk_name>
demoncodemonkey

5

要从数据库中删除所有约束,请执行以下操作:

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

4
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]

但是,请小心一点,一旦这样做,您可能再也找不到机会了,您应该阅读一些基本的数据库书籍,以了解为什么我们需要外键


1
只要他想返回约束,只要引用完整性仍然存在,他就可以再次添加约束。如果不是,则必须将其修复。
Tobberoth

@Tobberoth,是的,我的意思是,谢谢你说的清楚。在现实世界中,大多数情况下,其他一些开发人员会将表中的数据弄乱,并且由于那里的数据,您无法添加约束。
Simon Wang

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

您对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;

1
ALTER TABLE table
DROP FOREIGN KEY fk_key

编辑:没注意到您正在使用sql-server,我不好

ALTER TABLE table
DROP CONSTRAINT fk_key

1

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

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

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

你可以跑

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

...然后插入/更新一堆违反约束的值,然后通过运行原始CHECK语句将其重新打开。

(我不得不这样做,以清理过去继承的设计欠佳的系统。)


1

或者,您也可以从SQL Server Management Studio本身删除外键约束。如果命令不起作用,您可以尝试一下

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

希望对您有所帮助


1

首先使用

show create table table_name;

查看表格的描述性结构。

在那里,您可能会看到与在该表中使用的外键有关的约束。首先用删除各自的约束

alter table table_name drop constraint constraint_name;

然后删除您想要的相应外键或列... GoodLuck!


1

如果您发现表的FK名称已自动生成并且无法查看其确切含义(例如,在没有数据库权限的情况下),则可以尝试以下方法这个:

DECLARE @table NVARCHAR(512), @sql NVARCHAR(MAX);
SELECT @table = N'dbo.Table';
SELECT @sql = 'ALTER TABLE ' + @table
    + ' DROP CONSTRAINT ' + NAME + ';'
    FROM sys.foreign_keys
    WHERE [type] = 'F'
    AND [parent_object_id] = OBJECT_ID(@table);
EXEC sp_executeSQL @sql;

建立一个存储过程,该过程将删除指定表的约束,而无需指定实际的FK名称。当对象[type]等于F时,它会删除约束(外键约束)。

注意:如果表中有多个FK,它将全部删除。因此,如果您要定位的表只有一个FK,则此解决方案最有效。


0

使用这些查询查找所有FK:

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 

0

如果您不知道外键约束名称,请尝试此名称。

sp_help 'TableName'   

另外针对不同的模式

sp_help 'schemaName.TableName'   

然后

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

0

为了安全起见,只需命名您的所有约束,并在注释部分中记下它们。

ALTER TABLE[table_name]
DROP CONSTRAINT Constraint_name

如果忘记命名约束,则phpMyAdmin会给您使用唯一名称的任何约束。要通过phpMyAdmin检查此给定的唯一名称:单击工作台左侧的INFORMATION_SCHEMA。之后,向下滚动并找到TABLE_CONSTRAINTS并单击它。在那里,您将看到在各个列上设置的所有约束及其名称和其他详细信息。
Agbesi Innocent

-6
alter table <referenced_table_name> drop  primary key;

外键约束将被删除。


删除引用表的主键可能是尝试解决此问题的最糟糕方法。哦,等等-删除引用表本身可能会更糟。
brewmanz

这避免了所提出问题的实质
Spencer Sullivan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.