如何删除特定列的外键

时间:2016-03-29 14:23:55

标签: sql sql-server tsql

我创建了一个外键而没有指定名称,因此sql server使用自动生成的名称创建了它。现在我想删除具有此外键的列。问题是我不知道这个外键的名称。有没有办法删除特定表中特定列的所有外键?

到目前为止,我发现这个脚本会删除列

的所有默认约束
DECLARE @tableName VARCHAR(MAX)
DECLARE @ConstraintName nvarchar(200)
DECLARE @columnName VARCHAR(MAX)

SET @tableName = 'tablename'
SET @columnName = 'columnname'
SELECT @ConstraintName = Name
FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID(@tableName) 
AND PARENT_COLUMN_ID = (
    SELECT column_id FROM sys.columns
    WHERE NAME = @columnName AND object_id = OBJECT_ID(@tableName))
IF @ConstraintName IS NOT NULL
    BEGIN
 EXEC('ALTER TABLE '+@tableName+' DROP CONSTRAINT ' + @ConstraintName)
 END

ALTER TABLE [tablename] DROP COLUMN columnname
GO

但它对外键约束没有帮助。

3 个答案:

答案 0 :(得分:4)

如果您想获得有关FK的更多信息,特别是有关特定方案和表格的信息,请参阅。

 SELECT 
    t.Name as TableName,
    c.name as ColumnName, 
    fk.name as FK_NAME 

 FROM sys.foreign_keys as fk
 inner join sys.tables as t on fk.parent_object_id = t.object_id
 inner join sys.columns as c on c.object_id = t.object_id
 inner join sys.schemas as sc on t.schema_id = sc.schema_id
 WHERE sc.name = 'Schema' and t.name = 'Table' and c.name = 'Column'

如果您只对某个专栏感兴趣,那么您可以使用 Ross Presser 回答。

此外,如果您想删除所有fk约束,您可以执行此操作:

  Declare @sql  nvarchar(4000)
  SET @sql = N'';

  SELECT @sql = @sql + '
  ALTER TABLE [' + sc.NAME + '].[' + OBJECT_NAME(fk.parent_object_id) + ']' + ' DROP  CONSTRAINT ' + '[' + fk.NAME + ']
   '
  FROM sys.foreign_keys as fk
  inner join sys.tables as t on fk.parent_object_id = t.object_id
  inner join sys.columns as c on c.object_id = t.object_id
  inner join sys.schemas as sc on t.schema_id = sc.schema_id
  WHERE sc.name = 'schemaName'  and c.name = 'columnName' -- you can include and fk name
  ORDER BY fk.NAME
  PRINT @sql;
--EXEC sys.sp_executesql @sql; 

答案 1 :(得分:2)

您可以借助以下查询获取所有约束列表以及分配给特定表的名称:

SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME='YourTableName';

找到要删除的约束后,您可以借助以下查询来执行此操作:

ALTER TABLE Orders
DROP CONSTRAINT constraint_name;

答案 2 :(得分:1)

您可以在整个数据库中找到使用该列的所有约束:

SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU
WHERE CCU.COLUMN_NAME='someColumn'

输出提供约束名称及其附加的表。