没有`trigger`来设置同一表中另一列的默认值

时间:2018-07-07 08:47:27

标签: sql sql-server

是否可以不使用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

Online TestDemo

3 个答案:

答案 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