【问题标题】:Changing a column's datatype before disabling foreign key constraint and index在禁用外键约束和索引之前更改列的数据类型
【发布时间】:2012-04-27 16:35:29
【问题描述】:

我想更改列的数据类型。

因为该列被其他 2 个表作为外键引用,所以我需要删除其他 2 个表的外键约束。

当前表也有需要删除的索引。

如何做到这一点?

【问题讨论】:

    标签: sql-server sql-server-2008 constraints indexing


    【解决方案1】:

    您需要知道可以从sys 表中提取的索引和外键名称。删除它们的语法是:

    外键

    IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[foreign_key_index_name]') AND parent_object_id = OBJECT_ID(N'[dbo].[tablename]'))
    ALTER TABLE [dbo].[tablename] DROP CONSTRAINT [foreign_key_index_name]
    

    索引

    IF  EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[tablename]') AND name = N'index_name')
    DROP INDEX [index_name] ON [dbo].[tablename] WITH ( ONLINE = OFF )
    

    BOL 中也提供此信息。

    您可以通过以下查询找到索引和外键名称:

    select * from sys.indexes where object_id = object_id(N'[dbo].[tablename]')
    select * from sys.foreign_keys where parent_object_id = object_id(N'[dbo].[tablename]')
    

    【讨论】:

    • 感谢您的回答。我可以在不实际删除索引和约束的情况下更改列数据类型吗?我可以禁用它们吗?
    • 据我所知,您必须重新创建表才能更改列的数据类型。这意味着您必须删除并重新创建表、其索引和外键。如果您使用 SSMS (SQL Server Management Studio) 更改列类型,它将为您编写整个操作的脚本。我看到的一个问题是,当您在表中包含数据后将列更改为“非空”时,脚本将失败,除非您将默认值绑定到列,或编辑脚本以将字段设置为脚本将临时表中的数据传输到新创建的表中时的非空值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2018-05-29
    • 2017-04-05
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    相关资源
    最近更新 更多