【问题标题】:PRYMARY KEY must be unique exception while calling update mehtod调用 update 方法时 PRIMARY KEY 必须是唯一异常
【发布时间】:2014-11-26 01:47:49
【问题描述】:

我正在使用 java 和 SQLite 编写一个基于 GUI 的项目。我在我的 SQLite 数据库中创建了一个表并在我的项目中使用它。有几列我将 RoomNo 作为主键并给出了默认值 111。 问题是当我尝试从 jTable 中编辑或更新数据并将其保存到我的数据库时,它会显示异常,java.sql.SQLException:PRYMARY KEY 必须是唯一的。 我找不到它出现的原因。可能问题出在我的代码中。这是代码 f 更新方法。请帮我解决这个问题。

private void updateButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
    // TODO add your handling code here:
    try{
        String value1 = roomNumbertf.getText();
        String value2 = detailtf.getText();
        String value3 = statustf.getText();
        String value4 = billPerDaytf.getText();
        String value5 = clientNametf.getText();
        String value6 = clientAddresstf.getText();
        String value7 = clientMobileNotf.getText();
        String value8 = entryDatetf.getText();
        String value9 = leavingDatetf.getText();

        String sql = "update RoomStatusTable2 set RoomNo='"+value1+"', Details= '"+value2+"', Status='"+value3+"', BillPerDay='"+value4+"',ClientName='"+value5+"', ClientAddress='"+value6+"', ContactNo='"+value7+"', EntryDate='"+value8+"', LeavingDate='"+value9+"'";
        pstatement = connection.prepareStatement(sql);
        pstatement.execute();
        JOptionPane.showMessageDialog(null, "Information Updated");
        updateTable();
    }catch(Exception e){
        JOptionPane.showMessageDialog(null, e);
    }
}

// 这是我的 SQLite 表 crate 语句 CREATE TABLE "RoomStatusTable2" ("RoomNo" INTEGER PRIMARY KEY DEFAULT (111) "详细信息" CHAR,"状态" CHAR,"BillPerDay" CHAR,"AdvancedBooking" CHAR,"ClientName" CHAR,"ClientAddress" CHAR,"ContactNo" CHAR,"EntryDate" CHAR,"LeavingDate" CHAR)

如果需要更多信息或代码来了解问题所在,请评论我。

【问题讨论】:

  • Swing 标签被移除,因为问题本身不涉及 Swing。
  • 您正在尝试更新主键 (RoomNo)。您需要确保它与已存储的其他条目不同,否则您将获得此异常

标签: java sqlite


【解决方案1】:

UPDATE 可能应该以WHERE RoomNo = ... 结尾。 您的更新会将所有记录设置为具有相同的 RoomNo。

String sql = "update RoomStatusTable2 set Details=?, Status=?, BillPerDay=?, "
       + "ClientName=?, ClientAddress=?, ContactNo=?, EntryDate=?, "
       + "LeavingDate=? "
       + "where RoomNo = ?";
try (PreparedStateent pstatement = connection.prepareStatement(sql)) {
    pstatement.setString(1, value2);
    pstatement.setString(2, value3);
    pstatement.setString(3, value4);
    pstatement.setString(4, value5);
    pstatement.setString(5, value6);
    pstatement.setString(6, value7);
    pstatement.setString(7, value8);
    pstatement.setString(8, value9);
    pstatement.setInt(9, Integer.parseInt(value1));
    pstatement.executeUpdate();
} // Closes pstatement.

最好也制作字符串字段VARCHAR(40)之类的,VAR表示该字段不用空格填充。

【讨论】:

  • 您的建议非常有效:D。非常感谢您。但现在我面临一个新问题。这种更新方式只更新了jTable中的信息,不更新数据库中的数据!数据库中表的所有信息保持不变!你能建议我如何解决这个问题吗?
  • pstatement 必须关闭。我在最后一刻更改了声明 pstatement 的答案,使用 try-with-resources 自动关闭 PreparedStatement。
【解决方案2】:

错误本身是描述性的。 PRYMARY KEY 必须是唯一的。

  1. 检查数据库中是否已存在要更新的房间 no 值。

  2. 由于为列设置默认值,如果插入语句中未提供该值,则会添加该值。

3.您可以通过打印房间的值来检查房间没有值,如果它等于111或表中已经存在的任何其他值,则应提供不同的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2023-04-01
    • 2019-10-09
    • 2018-05-15
    • 2012-07-20
    • 2012-09-10
    相关资源
    最近更新 更多