sql-server - 如何命名 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
创建时约束的名称都不一样。
是否可以为此约束设置一个常量名称,或者以某种方式在脚本中轻松找到它?
解决方案
只需确保在创建约束时为其命名!
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;
推荐阅读
- spring-boot - 如何在 Spring Boot WebSocket 中使用自动装配组件?
- php - 我的语法关闭了,我不太明白,PHP 和 HTML,简单的 echo 语句
- javascript - Hooks 只能在函数组件的主体内部调用。但它已经在一个函数中
- recursion - 如何使用elixir递归实现二叉搜索树的高度?
- html - 如何使用服务器端渲染将我的反应服务器与 django 服务器结合起来?
- apache-nifi - 脚本在终端中运行良好,但在使用 ExecuteStreamCommand 运行时“未找到”
- python - 流式传输到网站而不是 Window OpenCV
- python - 使用Tkinter时如何解决Base64图像错误
- c++ - 如何从文件中读取 8 位 RAW 数据
- ios - Firebase 云消息传递:分析仪表板始终显示接收和打开计数为 0