SQlite:如果不存在则选择insert

时间:2012-02-23 15:59:29

标签: sql sqlite select insert

假设我们有一个用以下内容定义的表:

  

CREATE TABLE IF NOT NOT EXISTS信号(sigid INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT)

此表最初为空。 我希望使用select获取给定名称 sigid ,如果名称不存在,添加它并获取新的自动增量标识。

我想使用此查询,以便在需要时自动生成在另一个表中用作外键的新ID。我必须注意表演,所以我不能继续:

  1. 检查名称是否存在,并使用 SELECT
  2. 返回ID
  3. 如果返回的id为null,则使用 INSERT
  4. 创建一个新条目
  5. 使用新的 SELECT
  6. 再次获取新ID

    是否可以使用单个 SELECT 类似的查询来执行此操作?

    谢谢!

2 个答案:

答案 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;
}

我不知道还能告诉你什么...