默认日期约束有空记录

Posted

技术标签:

【中文标题】默认日期约束有空记录【英文标题】:default date constraint has null records 【发布时间】:2016-02-16 17:47:22 【问题描述】:

当一次插入多个记录时,我们偶尔会在下面的表/列中出现 EMPTY 记录。虽然从技术上讲这是允许的,因为该列可以为空,但默认约束应适用于插入的每一行。

ALTER TABLE [dbo].[JOB] ADD [DATE_CREATED] [nvarchar](35) NULL CONSTRAINT [DF_JOB_DATE_CREATED]  DEFAULT (sysdatetime())

我能想到的一个可能原因是“默认值仅在您没有明确插入该列时才适用”。但是我找不到任何代码可以做到这一点,但我仍在努力。还有其他可能的原因吗?

我们使用的是 SQL Server 2012。该列的目的是捕获创建的日期和时间以进行处理。我们不能让该列不可为空,因为这是一个不应该对业务产生影响的报告列。

感谢您的建议。

【问题讨论】:

为什么不让它不为空呢?除非某些东西专门插入 NULL,否则它将使用您的默认值,并且 NOT NULL 约束不是问题。 是的,它不应该为空。它是元数据列并不重要,您希望它始终被填充。至少,打开它以找到显式插入 null 的代码。 您还可以在插入后更新默认为空的可空列。顺便说一句,为什么地球上会有一个日期创建列是nvarchar(35) - 您的默认值是 datetime2,这应该是您的数据类型 - Bad habits to kick : choosing the wrong data type 感谢您的评论。 @GarathD 由于兼容性 - 并非所有客户端系统都支持 datetime2。 @Dan Field - 我也是这么想的,但我想把它作为最后的选择,因为它需要一些努力来设置类似于 prod 的系统。 【参考方案1】:

使列不为空。至少,这样做可以让您捕捉到哪些应用程序/查询显式插入了 NULL——这实际上是不应该被允许的。

除此之外,创建一个触发器:

CREATE TRIGGER trg_JOB_CreateDate
ON dbo.JOB
AFTER INSERT
AS
BEGIN
    UPDATE j
      SET DateInserted = GETDATE() -- consider using GETUTCDATE()
    FROM JOB j
    INNER JOIN inserted i 
    ON i.PrimaryKeyName = JOB.PrimaryKeyName
END

但是,这可能会导致一些额外的事务开销,并且不会阻止某人将该列更新为 = NULL。但同样,如果该值为 null 会破坏某些内容,那么您真的应该将列设为 NOT NULL

【讨论】:

好吧,插入后会产生数据准确性的问题。数百条记录添加到此表中,我们希望 datetime2 的 7 位精度保持这些记录的唯一性。 从我得到的基于 cmets 的内容来看,设置显式 null 似乎是造成问题的原因。我会朝那个方向前进。谢谢!! 哎哟。您是说您正在使用日期时间的值来制作唯一的行吗?它也是你的主键吗?? 没有。这不是主键的一部分。但我们希望这不会重复。 (由于糟糕的旧客户端系统) 没有明智的方法来保证或强制此列的唯一性。如果您想要唯一性,请添加另一列作为标识或默认为 NEXT VALUE FOR 序列。

以上是关于默认日期约束有空记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL 默认约束

如何添加 NOT NULL 约束以及列的默认值?

约束的类型

5-05约束的类型

mysql唯一约束

MySQL 默认约束