0
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
4

1 回答 1

1

是的,当你运行这个时:

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

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

只有在评估的后期,系统才会检查是否存在列列表中未提及的任何列或在VALUES子句中指定条目的列的默认值DEFAULT,并实际评估这些默认约束以获得值那些列。

如果您不走运,对GETDATE()(在约束中VALUES和在DEFAULT约束中)的两次调用将获得两个不同的值。

这与第二种情况不同,在第二种情况下,对GETDATE()(in VALUES) 的两次调用被认为是同一语句的一部分(我知道在第一种情况下感觉应该是一样的,但事实并非如此),而你'重新保证两个调用将收到相同的值。

于 2013-04-19T06:53:15.577 回答