【问题标题】:INSERT fail after set DEFAULT value column设置默认值列后插入失败
【发布时间】:2018-12-31 19:09:33
【问题描述】:

我将列添加到表中:

RedMarkItemsId (IDENTITY(1,1) NOT NULL PRIMARY KEY)
TaskId (UNIQUEIDENTIFIER)
CreationDate (DATETIME)
CreatedBy (UNIQUEIDENTIFIER)

我想创建这样的列:

  ALTER TABLE RedMarkItems ADD Item1 BIT DEFAULT(0)

但是当我尝试插入一些值时:

INSERT INTO RedMarkItems 
VALUES (
    '9B093907-2072-4F59-A55C-0003CE89EF9E', 
    GETDATE(), 
    '6074CAEA-7A8E-4699-9451-16C2EAF394EF')

它抛出错误:

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

如果我将 DEFAULT(0) 设置为新列,为什么会出现此错误?

表创建脚本:

CREATE TABLE RedMarkItems 
(
    RedMarkItemsId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    TaskId UNIQUEIDENTIFIER,
    CreationDate DATETIME,
    CreatedBy UNIQUEIDENTIFIER
)

【问题讨论】:

  • 在我的插入语句中,我有 TaskId、CreationDate 和 CreatedBy,我不需要指定 RedMarkItemsId,因为它是 IDENTITY(1,1),所以它是自动数字字段 @gtosto
  • 再想一想:identity 可以改为列列表中的任何位置,因此 SQL Server 无法猜测您提供的 3 个值应该进入 3您命名的列;你必须告诉它。这是一件好事:语言是一致的,而不是通过假设identity 恰好是第 1 列而过度慈善,在这种情况下,该假设可能会导致意想不到的结果,并且只会在一种情况下起作用。

标签: sql sql-server database tsql sql-insert


【解决方案1】:

这段 SQL 无效:

INSERT INTO RedMarkItems 
VALUES (
    '9B093907-2072-4F59-A55C-0003CE89EF9E', 
    GETDATE(), 
    '6074CAEA-7A8E-4699-9451-16C2EAF394EF')

当不提供所有列进行插入时,您需要明确指定目标列。由于您只分配 3 列,因此您可能需要:

INSERT INTO RedMarkItems(
    RedMarkItemsId, 
    TaskId, 
    CreationDate
) VALUES (
    '9B093907-2072-4F59-A55C-0003CE89EF9E', 
    GETDATE(), 
    '6074CAEA-7A8E-4699-9451-16C2EAF394EF'
);

【讨论】:

  • 看来,RedMarkItemsId应该换成TaskId了。他想省略 RedMarkItemsId,因为它是一个身份列...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2012-04-05
  • 2017-03-12
  • 2012-03-24
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多