java - 使用在下一个 `INSERT OR IGNORE` 语句中插入 `INSERT` 的 ID

标签 java sql sqlite insert prepared-statement

我使用 sqlite 3.7 并且有一个如下所示的架构:

CREATE TABLE IF NOT EXISTS subjects (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
);

CREATE TABLE IF NOT EXISTS predicates (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    predicate TEXT NOT NULL UNIQUE
);

CREATE TABLE IF NOT EXISTS objects (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    object BLOB NULL UNIQUE
);

CREATE TABLE IF NOT EXISTS statements (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    subject INTEGER NOT NULL REFERENCES subjects(id) ON DELETE RESTRICT, 
    predicate INTEGER NOT NULL REFERENCES predicates(id) ON DELETE RESTRICT, 
    object INTEGER NULL REFERENCES objects(id) ON DELETE RESTRICT
);

要在语句中插入一行,我首先插入或忽略谓词对象,然后检索ID:

INSERT OR IGNORE INTO predicates(predicate) VALUES (?)
SELECT predicates.id FROM predicates WHERE predicates.predicate = ?

最终执行

INSERT INTO statements(subject, predicate, object) VALUES (?, ?, ?)

我的问题是:有没有办法一次性直接执行这些(准备好的)语句?

INSERT OR IGNORE INTO predicates(predicate) VALUES (?);
SELECT predicates.id FROM predicates WHERE predicates.predicate = ?;
INSERT OR IGNORE INTO objects(object) VALUES (?);
SELECT predicates.id FROM objects WHERE objects.object = ?;
INSERT INTO statements(subject, predicate, object) VALUES (?, ?, ?);

最佳答案

last_insert_rowid()仅当实际插入某行时才有效。

您可能总是需要 SELECT,但您可以将它们作为子查询来执行:

INSERT OR IGNORE INTO predicates(predicate) VALUES (?);
INSERT OR IGNORE INTO objects(object) VALUES (?);
INSERT INTO statements(subject, predicate, object)
VALUES (?,
        (SELECT id FROM predicates WHERE predicate = ?),
        (SELECT id FROM objects WHERE object = ?)
       );

关于java - 使用在下一个 `INSERT OR IGNORE` 语句中插入 `INSERT` 的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26391151/

相关文章:

java - 在运行作为 JAR 存档分发的项目时加载图像等资源

postgresql - 如何将 postgres 数据库转换为 sqlite

SQL 查询连接两个表与第一个表行和第二个表值的后续行的一对多关系

php - MYSQL 查询执行很慢

java - 在JOOQ中实现batchMerge()

SQLite:一个单词中的FTS匹配可以忽略哪个字符

c++ - 'sqlite3_api' 未在此范围内声明

java - 根据条件 JSP 显示 HTML 代码

java - 使用 jComboBox 从数据库中过滤 jTable 数据

java - Spring 和 Freemarker 的编码问题