是否可以不使用trigger
来设置同一表中另一列的列默认值?
简单的演示如下:
DDL:
CREATE TABLE temp_T (col1 INT, col2 INT);
ALTER TABLE temp_T
ADD CONSTRAINT col1_def DEFAULT col2 * 2 FOR col1;
INSERT INTO temp_T (col2) VALUES (7);
我收到此错误:
消息128的15级状态1线2
在这种情况下,不允许使用名称“ col2”。有效表达式是常量,常量表达式和(在某些情况下)变量。列名称是不允许的。
我期望这些值:
col1 col2
------------
14 7
答案 0 :(得分:3)
您可以将该列创建为计算列,而不是为其指定默认值:
CREATE TABLE temp_T (col1 INT, col2 AS col1 * 2 PERSISTED);
现在,如果您插入值:
INSERT INTO temp_T (col1) VALUES (7);
您在col1
中得到7,在col2
中得到14。
但这现在是一个计算列,这意味着您无法向其中插入其他值-它始终是col1
中值的两倍。不知道这是否适合您的情况-但如错误所言:您不能在默认表达式中为该列使用另一列。
答案 1 :(得分:1)
不幸的是,您不能使用另一列来计算表的默认值。
不过,您可以创建一个计算列:
CREATE TABLE temp_T (col1 INT, col2 AS col1 * 2);
演示:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=ca13be5d4df4931bfe45ff1ee58768ff
答案 2 :(得分:1)
您不能基于其他列使用DEFAULT VALUE
。但是,然后您可能要问为什么有这样的要求?如果col2的值始终为2 * col1,那么为什么要将它存储在数据库中并浪费存储空间?
如果col2始终为2 * col1,则可以更改读取查询(或存储过程)来为您完成此操作:
select col1, 2 * col1 as computed_col2 from temp_T
如果要计算值,仅当col2为null时,您可以这样做:
select
col1,
case when col2 is null then col1 * 2 else col2 end as col2
from
temp_T
如果您有一些更复杂的逻辑,则需要使用trigger
。