如何在sql server中删除外键约束?

时间:2012-09-19 06:48:49

标签: sql-server database foreign-keys

我想从另一个表中删除外键,以便我可以插入我选择的值。

我是数据库的新手,所以请告诉我正确的sql查询以删除或删除外键值。

15 个答案:

答案 0 :(得分:122)

尝试以下

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

参考:http://www.w3schools.com/sql/sql_foreignkey.asp

答案 1 :(得分:11)

参考referential integrity这样做是错误的,因为一旦打破它就不容易再打开它而不必通过记录并删除那些打破约束的记录。

无论如何语法如下:

ALTER TABLE Tablename DROP CONSTRAINT ContName;

请参阅MSDN:

答案 2 :(得分:4)

ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]

但是,小心的是,一旦你这样做,你可能永远不会有机会回来,你应该阅读一些基本的数据库书,看看为什么我们需要外键

答案 3 :(得分:4)

从DB中删除所有约束:

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

答案 4 :(得分:2)

根据您使用数据库的语法或其他语法。

如果你正在使用 Oracle ,你必须把其他用户告诉你的内容:

ALTER TABLE table_name DROP CONSTRAINT fk_name;

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

ALTER TABLE table_name DROP INDEX fk_name;

答案 5 :(得分:1)

ALTER TABLE table
DROP FOREIGN KEY fk_key
编辑:没注意到你使用的是sql-server,我的错误

ALTER TABLE table
DROP CONSTRAINT fk_key

答案 6 :(得分:1)

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

如果你看一下表创建TSQL,你会看到类似的东西:

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

你可以运行

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

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

(我必须这样做才能清理我过去继承的设计不佳的系统。)

答案 7 :(得分:1)

删除表的所有外键:

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

答案 8 :(得分: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;

建立一个存储的proc,它删除指定表的约束而不指定实际的FK名称。它将删除对象[type]等于F(外键约束)的约束。

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

答案 9 :(得分: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 

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

sp_help 'TableName'   

另外针对不同的模式

sp_help 'schemaName.TableName'   

然后

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

答案 12 :(得分:0)

首先使用

show create table table_name;

查看表的描述性结构。

您可能会看到与在该表中使用的外键有关的约束。 首先使用

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

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

答案 13 :(得分:0)

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

ALTER TABLE[table_name]
DROP CONSTRAINT Constraint_name

答案 14 :(得分:-5)

alter table <referenced_table_name> drop  primary key;

将删除外键约束。