【问题标题】:Violation of PRIMARY KEY constraint ***'. Cannot insert duplicate key in object error违反 PRIMARY KEY 约束 ***'。无法在对象错误中插入重复键
【发布时间】:2020-03-13 17:31:07
【问题描述】:

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

com.microsoft.sqlserver.jdbc.SQLServerException:违反PRIMARY 键约束“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 已经在表中,但为什么又会生成呢?

【问题讨论】:

  • 听起来有人重新植入了IDENTITY,因此尝试插入重复值。
  • nSchedulerControllerPollId 不是这里的主键,@SergioArrighi。
  • @Larnu 有人重新播种了 IDENTITY 可能是真的,因为该表已使用应用程序与另一个表同步。如何检查当前身份?
  • @Larnu 这确实是问题所在。 SELECT IDENT_CURRENT('EM_SCHEDULER_POLLS') 返回 109303

标签: java sql-server jdbc primary-key


【解决方案1】:

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

DBCC CHECKIDENT (table_name, RESEED, 0)

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

编辑:如果你运行 DBCC CHECKIDENT (table_name, RESEED) 如果没有第三个参数,数据库会自动重置标识计数器。

【讨论】:

  • 但是 OP 数据。当它们到达表中已经存在的值时,这只会再次导致错误。
  • reseed 值必须大于表中的最高值,然后增量将继续前进,而不是尝试另一个现有值。
  • DBCC CHECKIDENT ('EM_SCHEDULER_POLLS', RESEED, 136161) 确实解决了这个问题。
猜你喜欢
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
相关资源
最近更新 更多