如何在SQL Server中创建一个默认约束依赖于其他列

4

i have a table like this

tab1

create table tab1(ID int identity(1,1), Type varchar(10),IsValued bit)

标签1:

ID Type IsValued
----------------
1   S   1
2   R   0
3   R   0
4   S   1
5   S   1
6   R   0
7   S   1

我希望创建一个约束(非触发器),而不是将值插入到IsValued列中。 当Type ='S'时,应将IsValued插入为1,当Type ='R'时,应将IsValued插入为0。

例如:IsValued = case when Type ='S' then 1 when Type ='R' then 0 end

我该如何实现这个约束?

1个回答

4
你需要一个计算列。例如:
CREATE TABLE tab1
(
 ID INT IDENTITY(1,1)
,[Type] VARCHAR(10)
,IsValued AS CASE [Type] WHEN 'S' THEN 1
                         WHEN 'R' THEN 0
             END
)

您可以使用以下语法添加到现有表格中:
ALTER TABLE dbo.tab1 ADD IsValued AS CASE [Type] WHEN 'S' THEN 1
                                                 WHEN 'R' THEN 0
                                     END

您可以在创建列后添加关键字PERSISTED来使该列持久化。持久化列意味着该字段存储在磁盘上。当您插入或更新记录时,SQL Server将在那一点计算出该值。如果您不这样做,每次访问行时,SQL Server都必须计算它。一个好的解释可以在SQL Server 2005 Computed Column Is Persisted中找到。
ALTER TABLE dbo.tab1 ADD IsValued AS CASE [Type] WHEN 'S' THEN 1
                                                 WHEN 'R' THEN 0
                                     END PERSISTED

该表新增了一个名为IsValued的列,使用以下语句添加: alter table tab1 add IsValued bit - Ram Das
@sharath 我已经根据你的问题更新了我的示例。 - twoleggedhorse
@sharath 只是一个小提示,你可能希望在 END 后添加单词 PERSISTED。这里有解释:https://dev59.com/H3NA5IYBdhLWcg3wjOpS - twoleggedhorse
好的,但是如果该列已经存在于该表中怎么办? @twoleggedhorse 使用此命令会出现错误。 ALTER TABLE dbo.tab1 ALTER COLUMN IsValued AS CASE [Type] WHEN 'S' THEN 1 WHEN 'R' THEN 0 END PERSISTED - Ram Das
@RamDas 你只能在特定条件下更改列:http://sqlserverplanet.com/ddl/alter-table-alter-column 你可能需要删除该列,然后使用关键字添加它。ALTER TABLE dbo.tab1 DROP COLUMN IsValued - twoleggedhorse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接