违反UNIQUE KEY时获取行的id

时间:2012-05-24 10:13:56

标签: mysql sql

我有一张桌子user。它有idemail列。

USER TABLE

id | email
1  | xxx@gmail.com
2  | yyy@gmail.com

idPRIMARY KEY AUTO_INCREMENTemailUNIQUE KEY。 当我在表中插入一个新行时,抛出了DUPLICATE KEY异常。我想获取引发id异常的DUPLICATE KEY

现在我正在这样做 -

BEGIN
DECLARE EXIT HANDLER FOR 1062
    BEGIN
        SELECT id
        INTO id
        FROM user
        WHERE email = 'xxx@gmail.com';
    END;
    INSERT INTO user
    (email)
    VALUES
    ('xxx@gmail.com');

SELECT LAST_INSERT_ID() INTO id;
END;

我想知道是否有更好的方法来做到这一点。这是为了避免再次扫描表格以获取其已扫描的ID以检查电子邮件的唯一性。

2 个答案:

答案 0 :(得分:1)

使用UNIQUE KEY BTREE进行扫描时使用速度非常快。

您是否希望在其他select查询

中自行检查现有价值

答案 1 :(得分:0)

使用INSERT ... ON DUPLICATE KEY UPDATE,然后get the autoincremented id as usual

  

如果表包含AUTO_INCREMENT列并且INSERT ... ON DUPLICATE KEY UPDATE插入或更新行,则LAST_INSERT_ID()函数将返回AUTO_INCREMENT值。例外:对于更新,LAST_INSERT_ID()在MySQL 5.1.12之前没有意义。但是,您可以使用LAST_INSERT_ID(expr)解决此问题。假设idAUTO_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;