【问题标题】:INSERT IGNORE INTO SELECT LAST_INSERT_ID()INSERT IGNORE INTO SELECT LAST_INSERT_ID()
【发布时间】:2012-11-25 01:08:18
【问题描述】:

我有以下代码。事情是 SELECT LAST_INSERT_ID() 这总是返回最后插入的行。如果在获取最后一行之前实际插入了一行,我可以使用 INSERT IGNORE 进行检查,还是我可以简单地再次执行一个 select 语句,即

SET _inserted_geolocation_id  =(SELECT id FROM geolocation where latitude= _geolocation_latitude AND longitude = _geolocation_longitude
    AND zoom = _geolocation_zoom AND yaw = _geolocation_yaw AND pitch =_geolocation_pitch);

BEGIN

DECLARE _inserted_geolocation_id int;

INSERT IGNORE INTO geolocation (latitude, longitude, zoom, yaw, pitch) 
VALUES (_geolocation_latitude, _geolocation_longitude, _geolocation_zoom, _geolocation_yaw, _geolocation_pitch);

/*SET _inserted_geolocation_id  = (SELECT LAST_INSERT_ID());*/
SET _inserted_geolocation_id  =(SELECT id FROM geolocation where latitude= _geolocation_latitude AND longitude = _geolocation_longitude
    AND zoom = _geolocation_zoom AND yaw = _geolocation_yaw AND pitch =_geolocation_pitch);

SELECT _inserted_geolocation_id;
END

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果INSERT IGNORE没有插入任何行,LAST_INSERT_ID()返回0,见Documentation

    如果您使用 INSERT IGNORE 并且该行被忽略,则 AUTO_INCREMENT 计数器不递增并且 LAST_INSERT_ID() 返回 0,即 反映没有插入任何行。

    【讨论】:

    • SET _inserted_geolocation_id = (SELECT LAST_INSERT_ID());即使我添加了重复行,也返回了最后一行
    • INSERT IGNORE INTO geolocation (latitude, longitude, zoom, yaw, pitch) VALUES (_geolocation_latitude, _geolocation_longitude, _geolocation_zoom, _geolocation_yaw, _geolocation_pitch);选择 LAST_INSERT_ID();