2012-05-02 93 views
1

我想在查詢中使用「insert on duplicate key update」來插入一個新行(如果它不存在)或者更新一個行(如果存在)。我似乎無法弄清楚是如何利用這一點,如果我沒有唯一的ID(因爲該行尚未建立,而這個ID將在插入可自動遞增)現在在重複鍵上插入更新

insert into foodchoices (unique,notunique) values (Idonthavethis,'test') 
on duplicate key update notunique = 'stuff'; 

,在上面這個例子中,它說「Idonthavethis」,我沒有任何這個字段的唯一值,因爲它還沒有作爲一行插入。不過,我確實希望這插入某種方式,我只是不知道如何。我期望它的行爲是這樣的:

insert into foodchoices (notunique) values ('test') 

但是,如果它是一個已經存在的字段,我將擁有該唯一值。有沒有某種形式的通配符或我可以使用的東西,當我沒有獨特的價值?

+0

如何確定記錄是否已存在?如果'notunique'確實不是唯一的,那麼插入一個新行並選擇多個版本中的任何一個版本的值爲'test''有什麼區別? – eggyal

回答

3

我認爲這個問題的答案在MySQL docs被解決:

如果表中包含的AUTO_INCREMENT柱和INSERT ... UPDATE插入一行,在LAST_INSERT_ID()函數返回值AUTO_INCREMENT。如果語句更新一行,LAST_INSERT_ID()是沒有意義的。但是,您可以使用LAST_INSERT_ID(expr)解決此問題。假設id是AUTO_INCREMENT列。要使LAST_INSERT_ID()對更新有意義,請按如下方式插入行:

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3; 
0

我想你可能會嘗試做的是選擇你有的值(如果存在然後更新)的行,否則插入。這只是一個句子。

我只是不明白你如何比較你現有的一個你沒有的值(生成的ID)。另外,如果ID是DB種子如何重複?

0

可能是你需要改變你的表結構來添加任何約束到「notunique」列。所以你可以:

insert into foodchoices (notunique) values ('test') on duplicate key update columntostoreyouruniqueid = unique; 

如果notunique沒有constants,那麼它意味着你將有獨特的設置。所以它必須加倍查詢。