【问题标题】:How to use generated id in SQL statement?如何在 SQL 语句中使用生成的 id?
【发布时间】:2017-01-14 10:40:46
【问题描述】:

我正在尝试从 Derby 数据库向表中添加一条新记录。我需要在其中一个字段中使用记录号。例如。我需要在照片字段中保存图像的路径。并且图像的名称必须与其 id 相对应。例如 1.jpg。我在尝试这个语句(这个例子中没有使用文件扩展名):

PreparedStatement pstmt = conn.prepareStatement("INSERT INTO Users (name, lastname, email, address, password, photo, lastvisit, status) VALUES ('" + name + "','" + lastname + "','" + email + "','" + address + "','" + DigestUtils.toMd5(password) + "', id, '" + now + "','user')");

但是我得到一个错误:java.sql.SQLSyntaxErrorException: Column 'ID' is either not in any table in the FROM list... 但是这个专栏肯定是存在的。错误的原因是什么?

【问题讨论】:

  • 无关,但是:请学会使用PreparedStatement正确。不要将值连接到 SQL 字符串中。请改用占位符 (?)。
  • 您的意思是如果新创建的Users 记录的用户ID 为42,您希望photo 的值是'42.jpg'?如果是这样,那么您需要一个更新语句插入返回新 ID 给您,或者您需要在触发器中执行。
  • 请参阅stackoverflow.com/questions/1915166/… 了解如何获取生成的 id,然后在后续语句中使用该值。
  • 是的,这是我现在使用的代码。此外,我还必须在下一个 SQL 语句中使用此 ID 来将文件路径添加到照片字段中。但它看起来太复杂了,我希望它应该是更方便的决定。

标签: java sql derby


【解决方案1】:

嗯,简而言之,恕我直言,您不能在 SQL 中做到这一点。 在您的表用户中,我猜您的 id 列是一个自动递增的主键。您可以做的是插入您的记录,然后获取为此插入语句生成的最后一个 id。然后你必须执行一个更新查询来设置你的照片列的值。

顺便说一句,一定要学会在准备好的语句中使用占位符

我不是 Derby 的专家,但浏览文档时我发现了如何获取生成的列。

pstmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keys = pstmt.getGeneratedKeys();
keys.next();
int id = keys.getInt();

【讨论】:

    猜你喜欢
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2023-03-15
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多