【问题标题】: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 给了我这个错误:

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

【问题讨论】:

    标签: sql sql-server tsql default


    【解决方案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');

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2010-11-12
      • 2021-11-06
      • 2016-04-17
      • 1970-01-01
      • 2014-05-27
      相关资源
      最近更新 更多