2016-12-24 93 views
0

我有下面的映射表,對名稱列的唯一關鍵:獲取一個新插入的元素的最後一個ID,或現有

id | name 
1 aaa 
2 bbb 
3 ccc 

我想,如果得到一個新創建的ID我插入一個新的值到這個表,就像這樣:

INSERT IGNORE INTO map VALUES(null, 'ddd'); 

我知道我可以getLastId()功能做到這一點。但我也想,如果一個名字已經存在獲取ID,並getLastId()功能在這種情況下返回0:

INSERT IGNORE INTO map VALUES(null, 'ccc'); 

這是可以做到用一個SQL,並且不,檢查是否存在記錄等?

+0

'getLastId()'不會給你的「id的值「甚至插入列。您的案例中的ID是「名稱」。你已經有了「名字」。這更像是一個概念上的事物,就是我認爲*身份*是什麼。 – hakre

回答

1

我認爲你需要去加倍努力,爲那一個:

  • 檢查是否存在 - 當如此:得到這個名字的ID
  • 如果不是:SELECT LAST_INSERT_ID();
1

取決於什麼資格作爲一個單一的查詢。

當你使用INSERT INTO ... ON DUPLICATE KEY UPDATE可以控制LAST_INSERT_ID()以這樣一種方式,它會返回上插入新的ID和更新「更新」的行的ID:

INSERT INTO map (name) VALUE ('ccc') 
    ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id); 

這將使在LAST_INSERT_ID()然後返回你感興趣的行的map.id

無論API是,你命名爲getLastId()(我不知道它,所以我不能提供更指針),這可能不工作,然後你需要發射第二個查詢來獲得它:

SELECT LAST_INSERT_ID(); 

看得那麼清楚: