【问题标题】:How to drop foreign keys of a particular column如何删除特定列的外键
【发布时间】:2016-07-17 04:13:32
【问题描述】:

我创建了一个没有指定名称的外键,因此 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

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

【问题讨论】:

  • EXEC sp_help 'TABLE_NAME'; 从结果集中复制 FK 约束名称,然后使用 DROP CONSTRAINT 命令删除它!

标签: sql sql-server tsql


【解决方案1】:

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

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

输出给出了约束名称和它附加到的表。

【讨论】:

    【解决方案2】:

    如果您想获得更多关于 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; 
    

    【讨论】:

      【解决方案3】:

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

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

      找到要删除的约束后,您可以借助以下查询来完成:

      ALTER TABLE Orders
      DROP CONSTRAINT constraint_name;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-10
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        相关资源
        最近更新 更多