1

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

用户表

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

id一个PRIMARY KEY AUTO_INCREMENT并且email是一个UNIQUE 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来检查电子邮件的唯一性。

4

2 回答 2

1

在扫描UNIQUE KEY BTREE中使用,所以它非常快。

您不想在附加select查询中自己检查是否存在价值吗

于 2012-05-24T10:19:44.307 回答
0

使用INSERT ... ON DUPLICATE KEY UPDATE,然后像往常一样获取自动递增的 id

如果表包含一AUTO_INCREMENT列并INSERT ... ON DUPLICATE KEY UPDATE插入或更新一行,则该LAST_INSERT_ID()函数返回该AUTO_INCREMENT值。例外:对于更新,LAST_INSERT_ID()在 MySQL 5.1.12 之前没有意义。但是,您可以使用. 假设那是列。要使更新有意义,请按如下方式插入行:LAST_INSERT_ID(expr)idAUTO_INCREMENTLAST_INSERT_ID()

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
于 2012-05-24T11:26:08.920 回答