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
答案 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并实际评估此类默认约束以获取这些列的值。
如果您运气不好,拨打DEFAULT
(GETDATE()
和VALUES
约束中)的两次调用将获得两个不同的值。
这与第二种情况不同,其中对DEFAULT
的两次调用(在GETDATE()
中)被认为是同一声明的一部分(我知道同样的声明应该是相同的)第一种情况,但事实并非如此,并且保证两次调用都会收到相同的值。