2012-05-24 25 views
1

我有一個表user。它有專欄idemail當UNIQUE KEY被違反時獲取一行的編號

用戶表

id | email 
1 | [email protected] 
2 | [email protected] 

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 = '[email protected]'; 
    END; 
    INSERT INTO user 
    (email) 
    VALUES 
    ('[email protected]'); 

SELECT LAST_INSERT_ID() INTO id; 
END; 

我想知道是否有更好的方法來做到這一點。這是爲了避免再次掃描表格以獲取它已經掃描的ID以檢查電子郵件的唯一性。

回答

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;
+0

我不想更新。我只想要郵件列給出DUPLICATE KEY值的id。 – JHS

+0

@Juniad:所以只需執行'INSERT ... ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id)',如圖所示。什麼都不會改變,但'LAST_INSERT_ID()'會給你你想要的ID。 – eggyal

+0

錯了。這將確實更新'Auto_increment'值,如下所述:http://stackoverflow.com/questions/12692003/avoid-increasing-auto-increment-value-when-using-last-insert-id – l33t

1

在掃描UNIQUE KEYBTREE被使用,所以它很快。

難道你不想爲您在附加select查詢

+0

+1之前插入檢查是一個更好的解決方案,試圖插入和追趕的錯誤。 – GarethD

+0

我想知道正在拋出UNIQUE KEY的行的id。 – JHS