【问题标题】:SQL Insert multiple entries non auto increment primary keySQL插入多个条目非自动递增主键
【发布时间】:2017-05-29 01:07:31
【问题描述】:

如何插入非自增主键?

如您所见,选择至少有 100 行,并且对于每次插入,我都需要获取最新的递增 ID。我不能使用SCOPE_IDENTITY,也不能修改数据库结构。

当前出现错误

违反主键约束“PK_DOCUMENT”。无法在对象“dbo.DOCUMENTS”中插入重复键

代码:

INSERT INTO [dbo].[DOCUMENTS] 
     (DOCUMENT_ID, DOCUMENT_TYPE, DOCUMENT_REF, DOCUMENT_NOTE,
      DOCUMENT_DATE, LAST_UPDATE_ID, LAST_UPDATE_DATE,
      DOCUMENT_FUNCTION_CODE, BATCH_ID, AUDIT_XML, AUDIT_USER, REMINDER_DATE)
    SELECT TOP 100
        (SELECT MAX(DOCUMENT_ID) + 1 FROM dbo.DOCUMENTS),
        NULL, NULL,
        'MIGRATED FROM BRING UP NOTES ' + CAST(GETDATE() AS VARCHAR(20)) + ' ' + sr.BRINGUP_NOTES,
        GETDATE(), NULL, NULL,
        NULL, NULL, NULL, NULL, sr.BRINGUP_DATE
    FROM 
        [dbo].[SERVICE_REQUESTS] sr
    WHERE 
        BRINGUP_NOTES IS NOT NULL
    ORDER BY 
        SERVICE_REQUEST_ID DESC

【问题讨论】:

  • 有什么帮助吗?戈登的以下回答不起作用

标签: sql sql-server select insert


【解决方案1】:

您应该使用identity 列。但如果没有,你可以使用row_number()

   SELECT TOP 100
          (SELECT MAX(DOCUMENT_ID) FROM dbo.DOCUMENTS) + ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
          . . .

这不适用于空表。

【讨论】:

  • @Gordon_Linoff 这是一个用于多源的旧数据库设计,所以不要修改结构更安全
  • 得到这个错误子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
  • @Gordon_Linoff 不知道为什么
  • 有什么想法吗?这是新的。
  • @ove 。 . .此答案中的子查询不能返回多于一行;这是一个没有GROUP BY ((SELECT MAX(DOCUMENT_ID) FROM dbo.DOCUMENTS)) 的聚合查询。
【解决方案2】:

试试这个............除了最大文档ID之外,还使用行号

         INSERT INTO [dbo].[DOCUMENTS] 
         (DOCUMENT_ID, DOCUMENT_TYPE, DOCUMENT_REF, DOCUMENT_NOTE,
          DOCUMENT_DATE, LAST_UPDATE_ID, LAST_UPDATE_DATE,
          DOCUMENT_FUNCTION_CODE, BATCH_ID, AUDIT_XML, AUDIT_USER, REMINDER_DATE)
        SELECT TOP 100
            (SELECT MAX(DOCUMENT_ID) + 1 FROM dbo.DOCUMENTS) + ROW_NUMBER() over (ORDER BY SERVICE_REQUEST_ID DESC),
            NULL, NULL,
            'MIGRATED FROM BRING UP NOTES ' + CAST(GETDATE() AS VARCHAR(20)) + ' ' + sr.BRINGUP_NOTES,
            GETDATE(), NULL, NULL,
            NULL, NULL, NULL, NULL, sr.BRINGUP_DATE
        FROM 
            [dbo].[SERVICE_REQUESTS] sr
        WHERE 
            BRINGUP_NOTES IS NOT NULL
        ORDER BY 
            SERVICE_REQUEST_ID DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2011-09-28
    • 2020-07-18
    • 2011-09-02
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多