75

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

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

4

15 回答 15

158

尝试关注

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>

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

于 2012-09-19T06:52:57.980 回答
14

在引用完整性方面这样做是错误的,因为一旦它被破坏,就不容易再次打开它,而不必检查记录并删除那些破坏约束的记录。

无论如何,语法如下:

ALTER TABLE Tablename DROP CONSTRAINT ContName;

见 MSDN:

于 2012-09-19T06:51:05.140 回答
5
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]

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

于 2012-09-19T06:52:30.443 回答
5

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

SELECT 'ALTER TABLE ' + Table_Name  +' DROP CONSTRAINT ' + Constraint_Name
FROM Information_Schema.CONSTRAINT_TABLE_USAGE
于 2015-02-24T18:41:34.067 回答
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
于 2018-01-11T14:55:00.347 回答
2

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

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

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

你可以跑

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

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

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

于 2016-02-07T17:30:45.697 回答
2

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

如果您使用的是Oracle,则必须输入其他用户告诉您的内容:

ALTER TABLE table_name DROP CONSTRAINT fk_name;

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

ALTER TABLE table_name DROP INDEX fk_name;
于 2017-10-22T11:16:25.953 回答
2

首先使用

show create table table_name;

查看表格的描述性结构。

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

alter table table_name drop constraint constraint_name;

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

于 2019-12-27T05:06:15.087 回答
1
ALTER TABLE table
DROP FOREIGN KEY fk_key

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

ALTER TABLE table
DROP CONSTRAINT fk_key
于 2012-09-19T06:51:21.550 回答
1

使用这些查询来查找所有 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 
于 2015-10-29T23:37:53.090 回答
1

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

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

我希望这会有所帮助

于 2017-01-13T00:24:29.283 回答
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,则此解决方案效果最佳。

于 2020-08-02T18:46:53.807 回答
0

如果您不知道外键约束名称,请尝试使用此方法找到它。

sp_help 'TableName'   

另外对于不同的模式

sp_help 'schemaName.TableName'   

然后

ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>
于 2019-11-22T20:59:59.783 回答
0

为了更安全,只需命名所有约束并在评论部分记下它们。

ALTER TABLE[table_name]
DROP CONSTRAINT Constraint_name
于 2020-04-09T12:55:52.227 回答
-6
alter table <referenced_table_name> drop  primary key;

外键约束将被删除。

于 2016-09-26T13:15:33.540 回答