标识列上的BatchUpdate

时间:2014-02-17 16:31:14

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

假设我有一张表如下:

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:违反PRIMARY KEY约束'...'。无法在对象'dbo.ProposalDetails'中插入重复键。重复键值为(1)。

batchupdate对ID​​ENTITY列不起作用吗?
我在SqlServer 2008上。

1 个答案:

答案 0 :(得分:0)

由于您的PK仅是ProposalId列,并且身份可以自行处理,因此您可能缺少某些内容。

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

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

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

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