2012-09-19 39 views
46

我想从另一个表中删除外键,这样我就可以插入我选择的值。如何删除sql server中的外键约束?

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

+21

如果您是数据库新手,遇到外键冲突时首先应该考虑“我会放弃外键”。 –

+2

可能的重复[如何在SQL Server中删除外键?](http://stackoverflow.com/questions/93264/how-do-i-drop-a-foreign-key-in-sql-server) – Liam

回答

96

尝试以下

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME> 

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

+1

我没有添加任何约束名称。我如何删除该约束? –

+1

即使您没有指定约束名称,SQL Server也会分配一个唯一的约束名称。您可以使用SQL Management Studio查找名称。 –

+0

您还可以在postgres命令行客户端中输入\ d table_name来查找约束的名称。通常看起来像“fk .......” – Nytux

1
ALTER TABLE table 
DROP FOREIGN KEY fk_key 

编辑:没有注意到你USI NG SQL服务器,我的坏

ALTER TABLE table 
DROP CONSTRAINT fk_key 
+0

我正在使用SQL Server。 –

+0

所以我注意到了:) – mokuril

4
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME] 

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

+1

只要参照完整性仍然存在,他可以再次添加约束条件,如果他想要回来的话。如果不是,那就必须修正。 – Tobberoth

+0

@Tobberoth,是的,我的意思是,谢谢你说清楚。在现实世界中,大部分时间,其他开发人员会混淆表中的数据,并且由于那些数据,您无法将约束添加回来。 –

4

要删除所有从DB约束:

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

使用这些查询找到所有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 
0

你应该考虑(临时)禁用约束之前,你完全删除它。

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

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

您可以运行

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

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

(我不得不这样做是为了清理设计不当的系统我继承了过去。)

-3
alter table <referenced_table_name> drop primary key; 

外键约束将被删除。

+0

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

0

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

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

我希望帮助

0

根据DB您使用有一个语法或其他。

如果您使用甲骨文你必须把什么其他用户告诉你:

ALTER TABLE table_name DROP CONSTRAINT fk_name; 

但是如果你使用MySQL的然后这会给你一个语法错误,而不是你可以键入:

ALTER TABLE table_name DROP INDEX fk_name; 
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