- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我继承了一个旧的Servlet/JSP网站,该网站已更新为Java 1.8.0_201和MySQL 5.7.28。最近,我在向数据库添加新记录时开始出现此错误:
Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate(), Statement.executeLargeUpdate() or Connection.prepareStatement().
我用谷歌搜索了发生的事情,发现我需要将 Statement.RETURN_GENERATED_KEYS 添加到我的 Statement.executeUpdateQuery 中,所以我这样做了。但是,我仍然收到错误。更新后的代码,错误发生在语句result = stmt.getGenerateKeys();
:
stmt = con.createStatement();
switch(queryType) {
case INSERT_QUERY:
stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
int autoIncKey = -1;
result = stmt.getGeneratedKeys();
if (result.next()) {
autoIncKey = result.getInt(1);
}
rows = stmt.getUpdateCount();
svr.setGeneratedKey(autoIncKey);
obj.setGeneratedKey(autoIncKey);
svr.setRows(rows); //Insert/Update/Delete
if (rows > 0)
svr.setSuccess(true);
else
svr.setSuccess(false);
break;
但是,插入有效并且数据已放入数据库中。
然后我想我应该更新Mysql Connector库,所以我从版本5.4更新到mysql-connector-java-8.0.18.jar。仍然遇到同样的错误。
我没有使用任何准备好的语句,只是使用一个字符串作为查询文本。这是查询字符串:
INSERT INTO Flights(rocket_name, weight, angle, baseline, egg_id, shockcord_id, notes, date, rocketModelID, mission_specialists, flight_engineers, teacher_id) VALUES ('asdfasdfasd', 98.0, 60.0, 60.0, 2, 2, 'sfdg sfdg sdg sfdg sdfg sfdg sfdg', '2020-01-07', 4,'asdfasdf', 'asdfasdfas', 13);
航类的表定义:
| Flights | CREATE TABLE `Flights` (
`flight_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`teacher_id` int(11) NOT NULL DEFAULT '0',
`egg_id` int(10) unsigned NOT NULL DEFAULT '0',
`shockcord_id` int(10) unsigned NOT NULL DEFAULT '0',
`rocket_name` varchar(100) NOT NULL DEFAULT '',
`weight` decimal(10,4) unsigned NOT NULL DEFAULT '0.0000',
`angle` decimal(10,5) NOT NULL DEFAULT '0.00000',
`baseline` decimal(10,5) NOT NULL DEFAULT '0.00000',
`date` date NOT NULL DEFAULT '0000-00-00',
`rocketModelID` int(11) unsigned NOT NULL DEFAULT '0',
`flight_engineers` varchar(100) NOT NULL DEFAULT '',
`mission_specialists` varchar(100) NOT NULL DEFAULT '',
`notes` text,
PRIMARY KEY (`flight_id`),
FULLTEXT KEY `search1` (`mission_specialists`),
FULLTEXT KEY `search2` (`flight_engineers`),
FULLTEXT KEY `search3` (`flight_engineers`,`mission_specialists`)
) ENGINE=MyISAM AUTO_INCREMENT=562 DEFAULT CHARSET=latin1
我不知道如何继续。任何建议将不胜感激!
标记
最佳答案
建议按如下方式更改您的代码:
为键列命名
通过 executeUpdate
调用获取行数
如果没有插入行,请勿调用 getGenerateKeys()
rows = stmt.executeUpdate(query, new String[] { "flight_id" });
int autoIncKey = -1;
if (rows > 0) {
result = stmt.getGeneratedKeys();
if (result.next()) {
autoIncKey = result.getInt(1);
}
}
svr.setGeneratedKey(autoIncKey);
obj.setGeneratedKey(autoIncKey);
svr.setRows(rows); //Insert/Update/Delete
svr.setSuccess(rows > 0);
尽管如此,使用 VALUES
的单个 INSERT
语句始终会恰好插入一行,因此完全不需要检查行数。如果未插入该行,则会引发异常,因此您的代码可以简化为:
stmt.executeUpdate(query, new String[] { "flight_id" });
try (ResultSet result = stmt.getGeneratedKeys()) {
result.next();
int autoIncKey = result.getInt(1);
svr.setGeneratedKey(autoIncKey);
obj.setGeneratedKey(autoIncKey);
}
svr.setRows(1);
svr.setSuccess(true);
关于java - MySQL使用Statement.RETURN_GENERATED_KEYS时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59737397/
prepareStatement(String sql, int autoGeneratedKeys) 之间有什么区别?和 prepareStatement(String sql, String[]
我正在使用适用于 sqlite 的 Xerial 最新 jdbc 驱动程序(版本 3.7.2),它似乎不支持语句 RETURN_GENERATED_KEYS。我不断在 SQLException 中收到
我试图在执行 SQL 插入时将标识列返回给我的 java 程序。运行代码时出现以下错误 Uncaught exception thrown in one of the service meth
JDBC 允许我们使用以下语法获取数据库自动生成的主键的值(例如 IDENTITY、AUTO_INCREMENT): PreparedStatement ps= connection.prepareS
带有返回生成键的准备语句正在为单次插入返回自动生成的键,但不适用于批量插入。有没有办法在插入过程中获取自动生成的值。 PreparedStatement ps = connection.pre
在我的数据库中插入一些数据后,我试图获取插入 ID。 String sql = "INSERT INTO ADI.DUMMY(dummy_data) VALUES('from database log
我在 JSP 中指定了以下 MySQL 查询。当我将项目从 MySQL 迁移到 Oracle DB 时,我想找出一个可以针对 Oracle 数据库正确运行的等效查询。 这个“clips”表的主键是“c
我正在尝试修复此代码以更新我在 mysql 数据库 5.6 中的日志表你知道如何从数据库中检索主键并将其分配给我的id变量(Log) 谢谢 没有 getter 和 setter 的日志模型 priva
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: How to get the insert ID in JDBC? 在下面的语句中,如何获取最后插入的 C12 标识
这是有问题的代码块: String sq = "INSERT INTO survey (session_id, character_id, timestamp) VALUES (?,?,?)"; Pr
某些 JDBC 驱动程序返回 Statement.RETURN_GENERATED_KEYS 的唯一方法是执行以下操作: long key = -1L; Statement statement = c
我曾经执行这个查询没有任何问题,但最近我遇到了异常。 (在 mysql 服务器上) 48442 [NioProcessor-1] ERROR c.x.xpofacebook.mysql.MysqlDb
我使用 Statement.RETURN_GENERATED_KEYS 一个接一个地运行两个 INSERT sql 调用,每个插入都有自己的唯一 ID 分配给它。 每个调用都是用 connection
我想批量执行 2 条 sql 语句。第一个语句是一个插入,它使用自动生成的值作为其 ID。第二条语句是对另一个表的插入,但它需要使用上面自动生成的值作为插入值的一部分 类似的东西(其中 id 只是为了
这是我的示例代码行 String query = "INSERT INTO tb_product_group values(?,?,?,?,?) ON DUPLICATE KEY UPDATE prg
import java.sql.* ; import java.util.* ; import java.io.* ; class DataBaseFactory{ public static
我是一名优秀的程序员,十分优秀!