【问题标题】:SQL Server 2008 : Cannot Insert new column in the middle position and change data typeSQL Server 2008:无法在中间位置插入新列并更改数据类型
【发布时间】:2011-09-01 14:06:56
【问题描述】:

我的操作系统是 Windows server 2008。

我已经安装了 SQL Server Express 2008。

我有几个问题:

  1. 我无法在中间位置插入新列。如果我插入最后一个,我可以保存表格设计。
  2. 我可以更改列名,但不能更改数据类型。

我收到错误消息: 不允许保存更改。您所做的更改需要删除并重新创建以下表。您对无法重新创建的表进行了更改,或者启用了阻止保存需要重新创建表的更改选项。

例子:

我有 ID, Name, Phone,Status 列。我无法在NamePhone 之间添加Address

但是,如果我把它放在Status 之后,我可以添加Address

有没有办法解决这个问题?

之前谢谢。

【问题讨论】:

标签: sql sql-server-2008 database-design


【解决方案1】:

在 SSMS 工具 -> 选项 -> 设计器中,您需要取消选中“防止保存需要重新创建表的更改”选项以允许您在 SSMS 中执行此操作。

这将重建表,因此如果表很大,通常不值得麻烦,并且会使部署到生产环境变得更加棘手。

如果有一些列在逻辑上您希望彼此相邻以便更轻松地编写查询,您可以创建一个具有所需列顺序的视图。

【讨论】:

    【解决方案2】:

    在设计器或 sys.columns 中的列顺序无关紧要

    磁盘存储将相同无论如何:Inside the Storage Engine - Anatomy of a record

    没有性能优势。

    【讨论】:

    • +1 希望我能 +100 这个!!列顺序是 dBase 时代的东西 - 1980 年代早已不复存在......
    • 确实有点不同。 sys.system_internals_partition_columns 中的初始 leaf_offset 已从列顺序中取出,因此它定义了固定/可变部分中的初始顺序(尽管 ALTER COLUMN 可能会导致此更改)。这可能会对varchar 列产生细微的影响,因为该部分末尾为空或为空的列即使在列偏移数组中也不会占用空间。
    • @Martin Smith: have you been reading again? :) 使用 SSMS 插入列将重新创建表,在末尾添加新列并没有什么区别。有趣的是,是否有可能通过重复的 ALTER COLUMN 来溢出 8060 字节限制,从而连续留下“死区”......?
    • @gbn - 是的,但是 Kalen Delaney SQL Server 2008 书。很好的链接谢谢。即使在表为空as covered here 时删除了列,删除列也会导致死空间导致溢出。要通过ALTER COLUMN 发生这种情况,我认为需要为不同的列交错ALTER COLUMNs。
    • @Martin Smith:我更多的是考虑 8060 字节限制和足够的死空间,而不是回收我无论如何都会做的空间。这就是为什么在永久删除列之后推荐使用DBCC CLEANTABLE 或 DBCC REINDEX。现在我们当然有 ALTER TABLE ..REBUILD 或 ALTER INDEX。哦,你聊天吗? chat.stackexchange.com/rooms/179/the-clustered-index
    【解决方案3】:

    我认为使用查询是不可能的,但您确实使用了 SSMS 的 UI。右键单击选定的表并随时插入列。

    认为列顺序无关紧要。

    【讨论】:

      【解决方案4】:

      如果您希望脚本执行此操作,您只需将数据选择到临时表中,删除该表,按照您的首选顺序使用列重新创建它,然后将临时表中的数据重新插入正确的顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        • 2014-11-11
        • 1970-01-01
        • 1970-01-01
        • 2013-06-11
        • 1970-01-01
        相关资源
        最近更新 更多