首页 > 解决方案 > 如何命名 T-SQL 中计算字段的约束?

问题描述

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

基本问题可以用下面的脚本来解释。它不起作用,因为在删除列之前应该删除生成的约束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 失败,因为一个或多个对象访问此列。

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

ALTER TABLE Table1
DROP CONSTRAINT DF__Table1__Field1__5AC46587
GO

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

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

标签: sql-servertsql

解决方案


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

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;

推荐阅读