java - JDBC 删除条目 - 主键/CONCUR_UPDATABLE 问题

标签 java mysql swing jdbc

我正在处理一个带有 Swing GUI 的小型数据库,该数据库已经可以运行,允许用户添加名称并搜索条目。现在我必须实现删除选项。以下是我得到的提示:

•确保将报表创建为可更新。
•确保更新插入语句以包含主键字段。使用“默认”一词作为字段的值(无引号)
•确保在结果集的查询中包含主键字段

目前我收到此错误:

com.mysql.jdbc.NotUpdatable: Result Set not updatable (referenced table has no primary keys).This result set must come from a statement that was created with a result set type of ResultSet.CONCUR_UPDATABLE, the query must select only one table, can not use functions and must select all primary keys from that table. See the JDBC 2.1 API Specification, section 5.6 for more details. at greenDB.PhoneBookFrame$2.actionPerformed(PhoneBookFrame.java:119)

现在,这是一个非常简单的错误,但我仍然在修复它时遇到问题。

我有多个类,但主要的是 DatabaseManager 和实例化 DatabaseManager 的 PhoneBookGui。在 DatabaseManager 上,语句的创建方式如下:

stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,  
                            ResultSet.CONCUR_UPDATABLE);

那么,按照上述提示,上面的代码创建了一个可更新的语句,对吗?

谈到主键,我修改了表创建以添加主键,并按照上面的建议添加默认值。这是我想到的:

"create table Listings (" +
    "PRIMARY KEY (id)" + //was not here before
    "LAST_NAME  varchar (16)," +
    "FIRST_NAME varchar (16)," +
    "AREA_CODE  varchar(3)," +
    "PREFIX     varchar(3)," +
    "SUFFIX     varchar(4))",
"insert into Listings values ('DEFAULT', 'ANDERSON', 'JOHN',  '314', '825', '1695')",
"insert into Listings values ('DEFAULT', 'CABLES',   'WALLY', '212', '434', '9685')",
"insert into Listings values ('DEFAULT', 'FRY',      'EDGAR', '415', '542', '5885')",
"insert into Listings values ('DEFAULT', 'MARTIN',   'EDGAR', '665', '662', '9001')",
"insert into Listings values ('DEFAULT', 'TUCKER',   'JOHN',  '707', '696', '8541')",

现在,假设这是正确的,我将进入第三部分,即确保在 ResultSet 的查询中包含主键字段。这应该在 DatabaseManager 类上还是在 GUI 内的实例化数据库上完成?我认为后一种选择是我应该做的。

正如我所说,我的 GUI 有添加和删除输入的按钮。添加按钮工作正常,我对代码做了一些更改以包含主键字段。以下是添加按钮上 ActionListener 的部分代码:

class GetListener implements ActionListener {
    public void actionPerformed(ActionEvent aEvent) {
      String defaultPrimaryKey = "default"; //was not here before
      (other strings...)
      myDB.doGetQuery(buildQuery(defaultPrimaryKey, last, first, ac, pre ,sfx)); //added the primary key String
      ResultSet rset = myDB.getResultSet();
      (...)

最后,这是删除按钮的代码:

public void actionPerformed(ActionEvent aEvent) {
   try {
      int selected = table.getSelectedRow();
      ResultSet rset  = myDB.getResultSet();

      if(selected != -1 && selected < tblModel.getRowCount()) {
         rset.absolute(table.getSelectedRow() + 1);
         rset.first();
         rset.deleteRow(); // line where I get the error
         table.repaint();
         table.clearSelection();
      }

有什么想法可以将有关主键和可更新语句的所有这些信息链接到上面的 deleteRow() 方法吗?

最佳答案

我为相关人员提供了解决方案。

同一个表中的许多行的主键值不能相同。 主键唯一地定义每行,因此每行需要有不同的主键字段值。 为此,当您创建表“Listings”时,您可以使用

"create table Listings (" +
    "LAST_NAME  varchar (16)," +
    "FIRST_NAME varchar (16)," +
    "AREA_CODE  varchar(3)," +
    "PREFIX     varchar(3)," +
    "SUFFIX     varchar(4)," +
    "ID MEDIUMINT NOT NULL AUTO_INCREMENT," + //this is the change you need
            "PRIMARY KEY (ID))",  //this is the change you need
    "insert into Listings (LAST_NAME, FIRST_NAME, AREA_CODE, PREFIX, SUFFIX) values ('ANDERSON', 'JOHN',  '314',  '825', '1965')",
    "insert into Listings (LAST_NAME, FIRST_NAME, AREA_CODE, PREFIX, SUFFIX) values ('CABLES', 'WALLY', '212',  '434', '9585')",
    "insert into Listings (LAST_NAME, FIRST_NAME, AREA_CODE, PREFIX, SUFFIX) values ('FRY', 'EDGAR', '415', '542', '5885')",
     "insert into Listings (LAST_NAME, FIRST_NAME, AREA_CODE, PREFIX, SUFFIX) values ('MARTIN',   'EDGAR', '665', '662', '9001')",
     "insert into Listings (LAST_NAME, FIRST_NAME, AREA_CODE, PREFIX, SUFFIX) values ('TUCKER',   'JOHN',  '707', '696', '8541')",

以下内容是必要且正确的

stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,  
                            ResultSet.CONCUR_UPDATABLE);

最后一部分是当您尝试删除行时,请确保在查询中包含主键“ID”。 例如:

String query = "select ID, LAST_NAME, FIRST_NAME, AREA_CODE, PREFIX, SUFFIX from Listings" + whereClause;
resultSet = statement.executeQuery(query);
resultSet.deleteRow();

关于java - JDBC 删除条目 - 主键/CONCUR_UPDATABLE 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22271475/

相关文章:

java - 为什么我需要所有这些空方法来为 Glide 创建自定义文件目标?

java - 如何将 JLabel 的文本放在其图标下

java - 为什么 GUI 应用程序使用左上角而不是左下角?

java - Hibernate 查询不返回零值

mysql - 使用当天的mysql创建CSV文件

java - SwingX JXTable boolean 列在突出显示时有不同的颜色

java - 尝试使用 Spring-WS - "Connection timed out"访问 WS 服务器,但服务器在使用 SOAP UI 测试时响应

java - AsyncTask 中通过代码旋转屏幕崩溃

java - 使用 Scanner 将多个输入分配给多个变量

mysql - MAX(count) + 1 插入时,MySQL