假设我们有一个用以下内容定义的表:
CREATE TABLE IF NOT NOT EXISTS信号(sigid INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT)
此表最初为空。 我希望使用select获取给定名称的 sigid ,如果名称不存在,添加它并获取新的自动增量标识。
我想使用此查询,以便在需要时自动生成在另一个表中用作外键的新ID。我必须注意表演,所以我不能继续:
是否可以使用单个 SELECT 类似的查询来执行此操作?
谢谢!
答案 0 :(得分:1)
我认为只有一个选择号。 我想说我想将id_build = 3,hashed_value = 1插入大表格'崩溃'。
示例中的代码首先选择检查表中是否已存在值,如果是,则跳过带有where .. is null
的插入,然后将已保存的id从已保存到临时表中。
例如:
create temporary table if not exists Variablez(Name TEXT primary key on conflict replace, Value TEXT); --storing vars
insert into Variablez(Name, Value) values ('tmp_id', (select id_crash from crash where hashed_value = "1" )); --put id if was existing
insert into crash(id_build, hashed_value) select 3, 1 where (select Value from Variablez where Name = 'tmp_id' ) is null; -- insert if not exists
select
case
when (select Value from Variablez where name = 'tmp_id' ) is null then
'0'
else
'1'
end
as existing,
case
when (select Value from Variablez where name = 'tmp_id' ) is null then
(select id_crash from crash where hashed_value = "1")
else
(select Value from Variablez where name = 'tmp_id')
end
as id_returned;
答案 1 :(得分:-2)
如果表是空的并且您只需一次填充它(并且当表中有数据时您不需要再次执行它),并且您没有太多行,然后你可以只缓存你已经插入的名字并在内存中查找它们。
我想这更像是评论。
还有这个用于获取最后插入的id:
SELECT last_insert_rowid();
但如果以上情况适用,您自己分配ID会更快,而不是将其定义为AUTOINCREMENT。然后你不需要获取最后一个插入的id,只需保留一个计数器并插入所有名称并为你找到的每个新名称递增。</ p>
CREATE TABLE IF NOT EXISTS signals(sigid INTEGER PRIMARY KEY NOT NULL, name TEXT)
List<String> insertedNames = new List<String>();
int count = 0;
while(input.hasNext())
{
String name = input.next();
if( !insertedNames.contains(name) )
{
var sql = "insert into table (sigid,name) VALUES (" + count + ", " + name + ")";
executeSql(sql);
insertedNames.add(name);
count++;
}
}
回答你的评论
public int getId( string name )
{
String sql = "select id from table where name='" + name + "'";
int theIdForTheName = executeAndGetFirstColumnAsInt(sql);
return theIdForTheName;
}
我不知道还能告诉你什么...