【问题标题】:INSERT, and get the auto-incremented valueINSERT,并获取自动递增的值
【发布时间】:2011-07-22 14:40:24
【问题描述】:

考虑下表:

create table language (
    id integer generated always as identity (START WITH 1, INCREMENT BY 1),
    name long varchar,
    constraint language_pk primary key (id)
);

我会以这种方式插入一个条目。

insert into language(name) values ('value');

如何知道为id 创造了什么价值?仅使用 name 字段执行 SELECT 无效,因为可能存在重复条目。

【问题讨论】:

标签: sql derby javadb


【解决方案1】:

通过普通 SQL:

 insert into language(name) values ('value');
 SELECT IDENTITY_VAL_LOCAL();

详见说明书:http://db.apache.org/derby/docs/10.7/ref/rrefidentityvallocal.html

从 Java 类(通过 JDBC)执行此操作时,您可以在使用适当的 executeUpdate() 方法“请求”它们之后使用 getGeneratedKeys()

【讨论】:

【解决方案2】:

你使用 JDBC 方法

st.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keys = st.getGeneratedKeys();

Derby manual 中所述。

另请参阅 Javadocs:DatabaseMetaData#supportsGetGeneratedKeys()Statement#getGeneratedKeys()

【讨论】:

    【解决方案3】:

    你可以执行这个语句(注意,不是 100% 确定这个语法对于 Derby 是正确的:

    SELECT TOP 1 id FROM language ORDER BY id DESC
    

    查找最后插入的 ID。

    德比的替代方案:

    SELECT MAX(id) from language
    

    显然,只有在您的插入和选择之间没有发生其他插入(包括其他用户的插入)时,这才是准确的。

    另见discussion

    【讨论】:

    • 在多用户环境中不安全 - 如果两个用户同时添加记录,您可能会得到错误的 ID。
    • @ain:正如我在回答中所说的那样。
    • 这将适用于我的特定程序(谢谢!)但很有趣,@ain 所说的
    • @xan 好吧,你在我发表评论后添加/编辑了它?当我写评论时它不在那里......
    • 我对影响返回给您的 ID 的其他插入的评论从一开始就存在。阅读您的评论后,我添加了有关其他用户与表格交互的具体说明,因为这是一个非常有效的观点。
    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 2015-01-10
    • 2010-11-27
    • 2021-11-13
    • 2018-02-24
    • 2012-03-14
    • 2017-03-03
    • 1970-01-01
    相关资源
    最近更新 更多