【问题标题】:change type of a computed column to uncomputed in sql在 sql 中将计算列的类型更改为未计算
【发布时间】:2023-03-05 11:21:01
【问题描述】:

我的数据库中有一些包含数据的计算列。无论如何,是否可以将这些列的类型更改为未计算,而无需将其数据删除并复制到新的未计算列中?

比如我想改变

[Fee] AS CONVERT([decimal](19,4),(case when [Quantity]=(0) then (0) else [Price]/[Quantity] end)) PERSISTED,

[Fee] [decimal](26, 16) NOT NULL,

【问题讨论】:

  • 你必须告诉我们这是什么具体数据库SQL 只是查询语言,但标准中没有定义类似的东西——它们是特定于供应商的。请添加适当的标签,例如mysqlpostgresqlsql-serveroracle 或您使用的任何标签。

标签: sql sql-server calculated-columns


【解决方案1】:

确切的答案是“视情况而定”。 MySQL 甚至没有计算列。在 SQL Server 中,我认为这是不可能的。在 Oracle 中,可以使用 alter table t1 modify fee DECIMAL( m, n ) 来完成。

但是,即使允许,DBMS 也可能在幕后创建新列、将计算值移动到新列、删除计算列并将新列重命名为计算列名称。因此,即使没有明确允许转换,您仍然可以完成。

【讨论】:

  • 郑重声明,后来者请注意MySQL(5.7.x)也支持computed columns。接受的答案假设计算列是虚拟的,但例如在 MySQL 的情况下它确实可能是STORED。但是,我分享@tommcatt 的想法,即使在这种情况下,MySQL 也不能简单地更改列类型而不在幕后做所有事情(添加新列、复制、删除旧列、重命名列)。
【解决方案2】:

计算列本身不存储数据。 当您尝试在查询中选择列时,它会计算数据并显示给您。您也不能将计算列修改为未计算列。

但你可以这样做:

Create Table Temp (ID BigInt, value Computed_Column_DataType)
Go
Insert Temp(ID, Value)
Select ID, ComputedColumnName
       From Your_Table
Go
Alter Table Your_Table Drop Column ComputedColumnName
Go
Alter Table Your_Table Add ComputedColumnName Computed_Column_DataType
Go
Update Your_Table Set ComputedColumnName = A.Value From Temp A Where A.ID = YourTable.ID

【讨论】:

  • 小错误:最后一行应该有 Your_Table 而不是 YourTable。 (抱歉,我无法编辑答案 - 这表示我需要更改至少 6 个字符。因此是评论。)
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2022-01-11
相关资源
最近更新 更多