首页 > 解决方案 > 违反 PRIMARY KEY 约束 ***'。无法在对象错误中插入重复键

问题描述

当我尝试在表中插入一行时出现以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException:违反主键约束“PK_EM_SCHEDULER_POLLS”。无法在对象“dbo.EM_SCHEDULER_POLLS”中插入重复键。重复键值为 (109303)。

导致错误的函数如下:

    public boolean setPollResults(int nSchedulerControllerPollId, Date dtExecuted, boolean blnSuccess)
    {
        try
        {
            PreparedStatement stmt = null;
            String strSQL;
            strSQL = "INSERT INTO EM_SCHEDULER_POLLS (SCHEDULER_CONTROLLER_POLL_ID  ,DATE_TIME_EXECUTED  ,POLLED_SUCCESSFULLY) VALUES (?,?,?)";

            stmt = this.getConnection().getConnection().prepareStatement(strSQL);

            stmt.setInt(1,nSchedulerControllerPollId);
            stmt.setTimestamp(2, new Timestamp( dtExecuted.getTime()));
            stmt.setBoolean(3,blnSuccess);

            boolean blnValue = stmt.executeUpdate()!=0;

             stmt.close();

            return blnValue;

        }
        catch (Exception ex)
        {
            if (Logger.isErrorEnabled())
                Logger.error(ex);
        }
        return false;
    }

这是餐桌设计。如您所见,我没有尝试在 ID 列中插入标识类型的值。重复值109303已经在表中,但为什么会再次生成呢?

在此处输入图像描述

标签: javasql-serverjdbcprimary-key

解决方案


似乎身份生成器已被重置。您可以尝试:

DBCC CHECKIDENT (table_name, RESEED, 0)

这会重置计数器,而不是0将下一个值放在更大的 id 值之后。

编辑:如果您在 DBCC CHECKIDENT (table_name, RESEED) 没有第三个参数的情况下运行,数据库将自动重置身份计数器。


推荐阅读