问题描述
我已经创建了一个这样的表
CREATE TABLE dbo.[Users]
(
[UserID_PK] INT IDENTITY(1,1) PRIMARY KEY NOT NULL,[Email] NVARCHAR(60) NOT NULL,[Username] NVARCHAR(15) NOT NULL,[Password] NVARCHAR(24) NOT NULL,[Salt] NVARCHAR(24) NOT NULL,[Token] NVARCHAR(200),[DateCreated] DATETIME DEFAULT (GETDATE()) NOT NULL
);
每次我的API创建记录时,它都会返回此消息。我不确定为什么不插入默认值而不是NULL。我已经尝试过GETDATE()
和CURRENT_TIMESTAMP
:
无法将值NULL插入“ DateCreated”列;列不允许为空。 INSERT失败。
解决方法
根本原因:
问题不在于您如何为表中的 DateCreated 列定义default
,这与您的插入语句无关。
如何隐式使用默认值:
如果要使用default
值,请确保在使用的default
语句中不包括用insert
定义的列。示例:insert into dbo.Users(Name) select 'someName'
如果在插入行时未在default
语句中显式地将其包含为insert
语句中的列,则用DateCreated
定义的列将隐式获得默认值。
为什么会出现错误: 您收到此错误:
无法将值NULL插入“ DateCreated”列;列不允许为空。 INSERT失败。
因为您在插入语句中明确包含了insert into dbo.Users(Email,DateCreated) select 'someName'
列,但未提供值,例如:insert into dbo.Users(Email,DateCreated) select 'someEmail',getdate()
解决方案:
要解决此问题,请为以下列提供一个值:DateCreated
或从插入中删除'2020-08-22 19:05:00'
,即使您在插入值时未将其包括在列中,它也会隐式获得默认值。对于该行上的其他列。如果您不想使用getdate()
或其他类似的日期函数,甚至可以硬编码字符串文字日期值{{1}}来设置特定的日期时间。
在SQL Server中,有两个用于插入默认值的选项。一种是忽略该列:
insert into users (email,username,password,salt,token)
values (?,?,?);
第二种是使用default
关键字:
insert into users (email,token,dateCreated)
values (?,default);
NULL
不是DEFAULT
的同义词。
我应该指出,实际上还有第三种方式。这需要浏览元数据表以查找列的默认值。通常,该方法没有用。有时候,这可能会很有帮助。