如何删除 sql 服务器中的外键约束?

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

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

314579 次浏览

在参考 参照完整性时这样做是错误的,因为一旦它坏了,就不容易再次打开它,而不必查看记录并删除那些打破约束的记录。

无论如何,语法如下:

ALTER TABLE Tablename DROP CONSTRAINT ContName;

见 MSDN:

ALTER TABLE table
DROP FOREIGN KEY fk_key

编辑: 没注意到你在使用 sql-server,我的错

ALTER TABLE table
DROP CONSTRAINT fk_key
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]

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

试着跟上

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

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

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

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

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

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

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

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

你可以逃跑

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

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

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

alter table <referenced_table_name> drop  primary key;

将删除外键约束。

或者,也可以从 SQLServerManagementStudio 本身删除外键约束。

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

希望能帮上忙

根据您使用的 DB,有一种或另一种语法。

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

ALTER TABLE table_name DROP CONSTRAINT fk_name;

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

ALTER TABLE table_name DROP INDEX fk_name;

删除表的所有外键:

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

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

sp_help 'TableName'

另外对于不同的模式

sp_help 'schemaName.TableName'

那么

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

第一次使用

show create table table_name;

查看表的描述性结构。

在那里,您可以看到与您在该表中使用的外键相应的约束。 首先使用

alter table table_name drop constraint constraint_name;

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

为了安全起见,只需要命名所有的约束,并在注释部分注意到它们。

ALTER TABLE[table_name]
DROP CONSTRAINT Constraint_name

如果你发现一个表的 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。因此,如果目标表只有一个 FK,那么这个解决方案的效果最好。