【问题标题】:How to insert existing data into auto-incrementing field如何将现有数据插入自增字段
【发布时间】:2014-03-21 11:57:11
【问题描述】:

我使用 SMAA 将 Access 2010 数据库升级到 SQL Server 2005。

在此过程中,由于某些损坏或非法数据,许多记录未导入 SQL Server。此后,我清理了未导入的数据并将其保存到数据库中的临时表中。我现在想将该数据插入到原始表中。但是,称为Task_ID 的字段之一是auto-incrementing 字段。当我运行标准插入查询时,结果数据auto-incremented 并没有使用导入的Task_ID 值。有没有办法在不改变数据的情况下将这些数据放入字段中?

【问题讨论】:

    标签: sql-server insert auto-increment


    【解决方案1】:

    SET IDENTITY_INSERT 命令包装INSERT 语句:

    SET IDENTITY_INSERT [table_name] ON
    
    ...
    
    SET IDENTITY_INSERT [table_name] OFF
    

    【讨论】:

    • 谢谢大家。我认为它类似于 Identity_Insert 命令。不幸的是,它似乎没有那么简单。我收到了错误:
    • 再试一次。多谢你们。我认为它类似于 Identity_Insert 命令。不幸的是,它似乎没有那么简单。我收到错误消息:“必须为表 'TaskList' 中的标识列指定显式值。此表中的标识列是 'Task',它是 PK 并且不在我的 INSERT 或 SELECT 语句中,因为它是不在要从中导入的表中。有没有其他方法可以解决自动增量问题而不与 PK 冲突?
    • 我正在尝试缩小范围。我创建了一个新的历史数据表,其中包括包括 PK 在内的所有列。当我尝试使用 IDENTITY_INSERT 参数执行 INSERT 时,我违反了 PK。我尝试使用 WHERE NOT EXIST 仅在 PK 值不存在时插入数据,但我没有取得任何进展。任何人都可以为我提供一个起点吗?
    • @user3178144:PK 是身份列吗?如果是这样,它是否包含INSERTSELECT 中?底线是,如果您要将INSERT 放入身份列,那么您需要SET IDENTITY_INSERT ON。如果你要去SET IDENTITY_INSERT ON,那么你需要INSERT进入身份。如果你想让它建立自己的身份,留下IDENTITY_INSERT单独和不包括INSERTSELECT中的PK。
    • 您必须使用显式列列表进行插入/选择操作。然后,您需要确保目标中不存在您的 PK - 或者,如果需要允许重复,您必须创建另一个 PK。那么你需要记住,只有一个表可以同时启用标识插入。
    【解决方案2】:

    为上传启用插入现有数据,然后再次将其关闭。

    http://technet.microsoft.com/en-us/library/aa259221(v=sql.80).aspx 解释如何:

    基本上它是一个 SQL 命令。语法是:

    SET IDENTITY_INSERT [ database. [ owner. ] ] { table } { ON | OFF }
    

    【讨论】:

      猜你喜欢
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多