插入查询:列名或提供的值的数量与表定义不匹配

Posted

技术标签:

【中文标题】插入查询:列名或提供的值的数量与表定义不匹配【英文标题】:Insert query: Column name or number of supplied values does not match table definition 【发布时间】:2021-06-02 09:17:19 【问题描述】:

这是一个自动递增 ID 的表格,接受时间输入,并将总列的默认值设置为零,将日期列设置为 getdate()

CREATE TABLE OrderPlaced (
    OrderID bigint IDENTITY(1,1) PRIMARY KEY,
    PlacedAt time NOT NULL,
    PlacedOn DATE NOT NULL default getdate(),
    Total MONEY default 0
)

所以我必须插入的唯一值是时间。

insert into OrderPlaced values ('13:40'); 

但是在插入时 SQL Server 给了我这个错误:

列名或提供的值数量与表定义不匹配。

【问题讨论】:

【参考方案1】:

错误告诉你问题所在。您的表OrderPlaced四个 列,但您只在INSERT 中提供一个 列,并且不告诉实例将其插入到哪一列。

对于您的表,如果您不指定列,那么它将期望PlacedAtPlacedOnTotal 的值;它不会期望 OrderID 的值,因为它是 IDENTITY 并且您尚未打开 IDENTITY_INSERT。由于实例需要 3 列,而您只提供了 1 列,因此您会收到一条错误消息,告诉您列数不匹配 (3 != 1)。

如果您只想在PlacedAt 中插入一个值,并允许其余列使用它们的DEFAULT 值,那么在您的INSERT 子句中定义您只想为PlacedAt 提供一个值:

INSERT INTO dbo.OrderPlaced(PlacedAt)
VALUES ('13:40');

或者,如果您(奇怪地)反对在 INSERT 子句中定义列,那么告诉实例其他 2 列需要它们的 DEFAULT 值。

INSERT INTO dbo.OrderPlaced
VALUES ('13:40',DEFAULT, DEFAULT);

虽然我不推荐这个解决方案,但是如果你改变表的定义,上面的语句就会失败。

【讨论】:

你能帮我吗?放置在的原始语句是 PlacetAt time Default convert(varchar(10), GETDATE(), 108),我不知道如何调用它,因为我不会插入任何值? 我不明白你在@HSaad 那里问的问题,但如果你有新问题,ask a new question。【参考方案2】:

您还需要指定列名,如下所示:

INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);

所以它会是这样的:

insert into OrderPlaced values ('13:40');

【讨论】:

以上是关于插入查询:列名或提供的值的数量与表定义不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Dapper ExecuteAsync 得到一个 SQLException:列名或提供的值的数量与表定义不匹配

列名或提供的值的数量与表定义不匹配。为啥?

请任何人清除错误:列名或提供的值的数量与表定义不匹配

获取错误列名称或提供的值的数量与表定义不匹配

列名或提供的值的数量与更新时的表定义不匹配

sql server 2005代码错误 提示插入错误: 列名或所提供值的数目与表定义不匹配。