以什么顺序插入行时添加列的默认值

时间:2013-04-19 06:42:39

标签: sql-server-2008

CREATE TABLE [dbo].[state_record](
    [row_id] [int] NOT NULL,
    [state_id] [smallint] NOT NULL,
    [user_login] [varchar](24) NOT NULL,
    [time_entered] [datetime] NOT NULL,
    [comment] [varchar](256) NOT NULL,
    [end_time] [datetime] NOT NULL
)
ALTER TABLE [dbo].[state_record]  WITH CHECK ADD  CONSTRAINT state_end_time_constraint] CHECK  (([time_entered]<=[end_time]))

ALTER TABLE [dbo].[alert_state_record] ADD  CONSTRAINT [DF__alert_sta__time___3E723F9C]  DEFAULT (getdate()) FOR [time_entered]


INSERT INTO alert_state_record(row_id, state_id, user_login, comment, end_time)
values(1,1,'max','resolving', getdate()) 

插入此表有时会产生错误“INSERT语句与CHECK约束冲突”state_end_time_constraint“。这是因为time_entered的值是在end_time之后计算的。

INSERT INTO alert_state_record(row_id, state_id, user_login, comment, time_entered, end_time)
values(1,1,'max','resolving', getdate(), getdate()) however works

1 个答案:

答案 0 :(得分:1)

是的,当你运行它时:

INSERT INTO alert_state_record(row_id, state_id, user_login, comment, end_time)
values(1,1,'max','resolving', getdate())

将考虑VALUES子句,并评估所有函数,以便可以插入实际值。如果使用关键字DEFAULT,则将与其他评估同时进行评估

只有在评估的稍后阶段,系统才会执行检查以查看列列表中未提及的任何列的默认值,或者在VALUES子句中指定的列{{1并实际评估此类默认约束以获取这些列的值。

如果您运气不好,拨打DEFAULTGETDATE()VALUES约束中)的两次调用将获得两个不同的值。

这与第二种情况不同,其中对DEFAULT的两次调用(在GETDATE()中)被认为是同一声明的一部分(我知道同样的声明应该是相同的)第一种情况,但事实并非如此,并且保证两次调用都会收到相同的值。