我正在处理一个带有 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/