2016-12-24 57 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(); 

看得那么清楚: