我想从另一个表中删除外键,以便我可以插入我选择的值。
我是数据库新手,所以请告诉我正确的 sql 查询以删除或删除外键值。
尝试关注
ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>
ALTER TABLE [TableName] DROP CONSTRAINT [CONSTRAINT_NAME]
但是,要小心,一旦你这样做了,你可能永远不会有机会回来,你应该阅读一些基本的数据库书籍,看看为什么我们需要外键
要从数据库中删除所有约束:
SELECT 'ALTER TABLE ' + Table_Name +' DROP CONSTRAINT ' + Constraint_Name
FROM Information_Schema.CONSTRAINT_TABLE_USAGE
删除表的所有外键:
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
在完全删除约束之前,您应该考虑(暂时)禁用它。
如果您查看表创建 TSQL,您将看到如下内容:
ALTER TABLE [dbo].[dbAccounting] CHECK CONSTRAINT [FK_some_FK_constraint]
你可以跑
ALTER TABLE [dbo].[dbAccounting] NOCHECK CONSTRAINT [FK_some_FK_constraint]
...然后插入/更新一堆违反约束的值,然后通过运行原始CHECK
语句将其重新打开。
(我不得不这样做来清理我过去继承的设计不佳的系统。)
根据您使用的数据库,有一种语法或另一种语法。
如果您使用的是Oracle,则必须输入其他用户告诉您的内容:
ALTER TABLE table_name DROP CONSTRAINT fk_name;
但是如果你使用MySQL,那么这会给你一个语法错误,你可以输入:
ALTER TABLE table_name DROP INDEX fk_name;
首先使用
show create table table_name;
查看表格的描述性结构。
在那里,您可能会看到与您在该表中使用的外键相关的约束。首先删除相应的约束
alter table table_name drop constraint constraint_name;
然后删除您想要的相应外键或列......祝你好运!
ALTER TABLE table
DROP FOREIGN KEY fk_key
编辑:没有注意到你在使用 sql-server,我的错
ALTER TABLE table
DROP CONSTRAINT fk_key
使用这些查询来查找所有 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
或者,您也可以从 SQL Server Management Studio 本身中删除外键约束。如果命令不起作用,您可以尝试一下。
我希望这会有所帮助
如果您发现自己处于自动生成表的 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,则此解决方案效果最佳。
如果您不知道外键约束名称,请尝试使用此方法找到它。
sp_help 'TableName'
另外对于不同的模式
sp_help 'schemaName.TableName'
然后
ALTER TABLE <TABLE_NAME> DROP CONSTRAINT <FOREIGN_KEY_NAME>
为了更安全,只需命名所有约束并在评论部分记下它们。
ALTER TABLE[table_name]
DROP CONSTRAINT Constraint_name
alter table <referenced_table_name> drop primary key;
外键约束将被删除。