2012-02-23 46 views
1

讓我們假設我們有一個定義的表:SQlite的:用刀片選擇,如果不存在

CREATE TABLE IF NOT EXISTS信號(sigid INTEGER PRIMARY KEY AUTOINCREMENT,姓名文本)

此表最初是空的。 我想獲得的sigid對於給定與選定的一萬一不存在,添加它,並獲得新的自動增量ID。

我想用這個查詢,以自動生成,在需要的時候,也就是用作其它表的外鍵一個新的ID。我必須把關注的表演,所以我不能爲繼續:如果name存在

  1. 檢查,並返回ID難熬一個選擇
  2. 如果返回ID爲空創建具有INSERT
  3. 一個新條目
  4. 用新再次獲得新的ID選擇

是否有可能用單一做到這一點選擇 -like查詢?

謝謝!

回答

-2

如果表是空的,你是一個在短短的一杆加油吧(你不以後需要再次做到這一點時,有表中的數據),並且你沒有太多行,那麼你可以緩存已經插入的名字並在內存中查找它們。

它更像是一個評論,我猜。

還有本作獲得最後插入的ID:

SELECT last_insert_rowid(); 

但是,如果上述應用,你會更快自行分配的ID,而不是把它定義爲AUTOINCREMENT。然後,您不需要獲取最後插入的ID,只需保留一個計數器並插入所有名稱,然後爲每個新名稱增加。

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

我不知道還有什麼要告訴你......

+0

我已經找到了這個選項,但它不是我要找的。當我要求一個已經存在的名稱的ID時,它可能會返回錯誤的ID。例如,假設按照「CAT」 - > id = 1「DOG」 - > id = 2「FISH」 - > id = 3的順序添加。當我發送「CAT」查詢時,它會返回我id = 3(最後插入的id),即錯誤的id。 – alexroat 2012-02-23 16:08:37

+0

回答您的意見,我需要看到你的代碼,這裏是我會做:'從表中選擇id其中名稱='CAT'' – mindandmedia 2012-02-23 16:13:57

+0

讓我們incapsulate在一個函數的getId(名)這個查詢。 (「DOG」),getid(「CAT」),getid(「DOG」),getid(「FISH」),getid(「CAT」),getid(「BUNNY」)應按順序返回1, 2,1,3,2,4 last_inserted_id並不總是我要找的。 – alexroat 2012-02-23 16:15:56

1

我覺得有一個選擇無。 假設我想將id_build = 3,hashed_value = 1插入大表'crash'中。

示例中的代碼首先選擇檢查值是否已經在表中,如果是,則跳過插入,然後將已保存的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; 
相關問題