【问题标题】:BatchUpdate on identity columns身份列上的 BatchUpdate
【发布时间】:2014-02-17 16:31:14
【问题描述】:

假设我有一张如下表:

CREATE TABLE [dbo].[ProposalDetails](
 [ProposalId] Numeric(15,0) IDENTITY(1,1) NOT NULL,
 [ProjectProposalId] Numeric(15,0) NOT NULL,
 [projectId] Numeric(15,0) NOT NULL,
 CONSTRAINT [ProposalDetails$ProposalId] PRIMARY KEY CLUSTERED 
)

尝试以下列方式批量插入多条记录 - (在标识列上不插入):

String sql = "INSERT INTO ProposalDetails"
                + "(ProjectProposalId,projectId) VALUES"
                + "(?,?)";
        preparedStatement= conn.prepareStatement(sql);
        conn.setAutoCommit(false);//commit trasaction manually

        for(int i = 0; i < arr.length(); i++){
            preparedStatement.setInt(1,...);
            preparedStatement.setString(2,...);
           preparedStatement.addBatch();
        }
        preparedStatement.executeBatch();
        conn.commit();

这会导致以下异常:

a.sql.BatchUpdateException:违反主键约束“...”。无法在对象“dbo.ProposalDetails”中插入重复键。重复键值为 (1)。

批量更新不适用于 IDENTITY 列吗?
我在 SqlServer 2008 上。

【问题讨论】:

    标签: sql sql-server sql-server-2008 jdbc prepared-statement


    【解决方案1】:

    由于您的 PK 是单独的 ProposalId 列,并且身份可以自行处理它,因此您缺少一些东西。

    1) 检查是否有触发器试图在该表中插入错误值。

    2) 验证是否有任何同事离开了设置 identity_insert ON 的表。

    3) 检查是否有另一个模式(dbo 除外)与另一个名为 ProposalDetails 但列略有不同的表。

    4) 您可以使用 reseed 将表放回路径上。 http://technet.microsoft.com/pt-br/library/ms176057.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 2020-02-12
      • 1970-01-01
      • 2015-09-26
      • 2012-04-21
      • 1970-01-01
      • 2021-05-15
      相关资源
      最近更新 更多