使用预准备语句插入。如何自动递增 ID?

我有一个准备状态,例如:

 PreparedStatement preparedStatement = connect.prepareStatement("INSERT into employee (id, time, name" + "(?,?,?)",Statement.RETURN_GENERATED_KEYS);
 ResultSet tableKeys = preparedStatement.getGeneratedKeys();
 preparedStatement.executeUpdate();
 tableKeys.next();
 int autoGeneratedID = tableKeys.getInt(1);
 preparedStatement.setInt(1,autoGeneratedID);
 preparedStatement.setTimestamp(2, new java.sql.Timestamp(new java.util.Date().getTime()));                           
 preparedStatement.setString(3, "Test");
 preparedStatement.executeUpdate();

如您所见,Employee 表具有自动递增的 ID。我基本上需要使用readyStatement自动添加它。有人可以告诉我哪里出了问题并纠正我吗?现在它只是给了我一个与声明相关的错误。


答案 1

将该列完全从语句中省略。它将由数据库引擎生成。您的查询应该是:INSERT

INSERT INTO employee (time, name)
VALUES (?, ?)

其次,您必须首先执行插入,然后从结果中获取键。

我相信你的代码应该是:

PreparedStatement preparedStatement = 
    connect.prepareStatement("INSERT into employee (time, name) VALUES (?,?)", 
    Statement.RETURN_GENERATED_KEYS);

preparedStatement.setTimestamp(1, 
    new java.sql.Timestamp(new java.util.Date().getTime()));                           
preparedStatement.setString(2, "Test");

preparedStatement.executeUpdate();

ResultSet tableKeys = preparedStatement.getGeneratedKeys();
tableKeys.next();
int autoGeneratedID = tableKeys.getInt(1);

请注意,此示例不检查执行的语句是否成功或返回的键是否存在。


答案 2

您应该对预准备语句字符串执行一些修改(定义语句),如下所示:default

"INSERT into employee VALUES(default,?,?)"

该修改是由于出现此问题:列计数与第 1 行 JAVA mysql 的值计数不匹配

之后,你的代码如下:

PreparedStatement preparedStatement = 
connect.prepareStatement("INSERT into employee VALUES (default,?,?)", Statement.RETURN_GENERATED_KEYS);

preparedStatement.setTimestamp(1, new java.sql.Timestamp(new java.util.Date().getTime()));                           
preparedStatement.setString(2, "Test");

preparedStatement.executeUpdate();

ResultSet tableKeys = preparedStatement.getGeneratedKeys();
tableKeys.next();

感谢Ic.的回答。


推荐