SQL Server:无法插入默认列值

问题描述

我已经创建了一个这样的表

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的同义词。

我应该指出,实际上还有第三种方式。这需要浏览元数据表以查找列的默认值。通常,该方法没有用。有时候,这可能会很有帮助。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...