【问题标题】:How to name constraints on computed fields in T-SQL? [duplicate]如何命名 T-SQL 中计算字段的约束? [复制]
【发布时间】:2020-04-08 14:45:09
【问题描述】:

在我们的数据库中采用一些新的计算字段时,我们需要能够恢复更改,然后再将它们放回去。

基本问题可以用下面的脚本来解释。它不起作用,因为在删除列 Field1 之前应该删除生成的约束:

CREATE TABLE Table1 
(
    Field1 DECIMAL(19, 2) NOT NULL DEFAULT(0.0),
    Field2 AS Field1
)
GO

ALTER TABLE Table1
DROP COLUMN Field2, Field1
GO

DROP TABLE Table1
GO

SSMS 显示:

消息 5074,第 16 级,状态 1,第 10 行
对象“DF__Table1__Field1__5AC46587”依赖于列“Field1”。

消息 4922,第 16 级,状态 9,第 10 行
ALTER TABLE DROP COLUMN Field1 失败,因为一个或多个对象访问此列。

如果在删除列 Field1 之前删除了约束 DF__Table1__Field1__5AC46587,则代码有效:

ALTER TABLE Table1
DROP CONSTRAINT DF__Table1__Field1__5AC46587
GO

问题是每次创建Field2时,约束的名字都不一样。

是否可以为此约束设置一个常量名称,或者以某种方式在脚本中轻松找到它?

【问题讨论】:

  • 您可以将约束添加为单独的命令并为其命名。如果您使用 SSMS 为您的表格编写脚本,它会完全照此执行。
  • @DaleK:恐怕不会。据我了解,约束与将列创建为计算列紧密相关。之后无法使用单独的命令创建它(没有任何意义吗?)
  • 计算列没有约束?约束在 Field1 上,它是一个真实字段,计算列是 Field2。所以问题不在于您的计算列,错误是指 Field1?因此,您可以在创建期间或之后命名约束,随心所欲。
  • @DaleK:我错了,建议的答案也回答了这个问题。

标签: sql-server tsql


【解决方案1】:

只需确保在创建约束时命名约束!

CREATE TABLE Table1 
(
    Field1 DECIMAL(19, 2) NOT NULL 
        CONSTRAINT DF_Table1_Field1 DEFAULT(0.0),   -- use the "CONSTRAINT" clause and a fixed name
    Field2 AS Field1
)
GO

始终为您的任何约束定义明确的名称是一个非常好的做法 - 这样您就知道您在做什么,并且您可以放弃或禁用这些约束(因为它们具有明确定义的名称)。

更新:如果你想稍后添加约束,在创建表之后,你也可以使用:

CREATE TABLE dbo.Table1 
(
    Field1 DECIMAL(19, 2) NOT NULL,
    Field2 AS Field1
)
GO

// then sometime later
ALTER TABLE dbo.Table1
ADD CONSTRAINT DF_Table1_Field1 DEFAULT(0.0) FOR Field;

【讨论】:

  • 经过一些试验,我认为这个问题与Field2有关,但事实并非如此。
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
相关资源
最近更新 更多