【问题标题】:sqlite: lookup-or-replacesqlite:查找或替换
【发布时间】:2011-01-23 21:05:49
【问题描述】:

我想使用 sqlite(使用 Java JDBC,不确定是否重要)向数据库添加或替换新行,并返回自动生成的行 ID,但我不知道该怎么做高效/干净。

表定义有 >= 3 列:

  • 自动生成的整数ID
  • 唯一的密钥字符串(我们称之为key
  • 其他元数据

我可以想到两种通用的方法:

  1. SELECT ID FROM myTable WHERE key = ?
  2. 如果没有匹配,则插入新行,然后重复步骤 #1 以获取自动生成的 ID

  1. INSERT OR REPLACE INTO myTable (key, metadata) VALUES (?, ?)
  2. SELECT ID FROM myTable WHERE key = ?

我该怎么办?不确定这两种方法是否是原子事务。 (嗯,第一个不是,第二个不确定)


编辑:我刚刚尝试了 INSERT OR REPLACE 方法,它“有效”,除了它还用新的 ID 替换了 ID,这不是我想要发生的。我想保留现有的 ID。

【问题讨论】:

  • OMG - Java 是一个完全有效的标签。可能有 Java 框架特定的解决方案(例如休眠)。
  • @cyberkiwi:这个问题与 java 无关——完全是 SQL。不会改变您回滚我的编辑以使问题更具可读性的事实。您有权编辑问题 - 开始负责任地使用它并成长。
  • @OMG - 问题指出,我引用using Java JDBC..replace a new row to a database, and return the autogenerated ID of the row。对此有 Java 框架解决方案。你从哪里得到"not related to Java" 位。它可以按原样阅读,除非您无法辨别间隙和两者之间的“或”
  • 看,感谢 @OMG Ponies 的帮助,但我同意 @cyberkiwi 并且您不必添加额外的格式。这很清楚,恕我直言
  • @cyber:这就是为什么你需要删除我所有的编辑?你在这里只是因为我在。

标签: java sqlite jdbc


【解决方案1】:

使用 PreparedStatement 您可以为插入返回生成的密钥,因此无需在插入后运行 select 语句来获取密钥。

为此:

  • 准备语句时,请使用 允许您指定它的方法 返回生成的密钥。
  • 在语句对象上运行更新调用“getGeneratedKeys()”之后。

【讨论】:

  • 你能举个例子吗?我查看了 PreparedStatement,它说 executeUpdate() 返回一个 int,它是行数,而不是生成的键。此外,如果它是更新而不是插入,我不确定该怎么办(我必须处理这两种情况)。
  • 准备语句时,使用允许您指定它的方法返回生成的密钥。在语句对象上运行更新调用“getGeneratedKeys()”之后。
  • 啊!我没有看到那个方法。谢谢,我试试看。
  • 嘿,效果很好(建议您将getGeneratedKeys() 放入您的答案中)- 除了 INSERT OR REPLACE 将旧的自动生成的 ID 替换为新的 ID :-(
【解决方案2】:

有一个用于获取最后插入的自动 ID 的 SQLITE 函数

SELECT last_insert_rowid()

不确定它是否适用于更新

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    相关资源
    最近更新 更多