1

私はテーブルを持っていますuser。列idとがありますemail

ユーザーテーブル

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 を取得するためにテーブルを再度スキャンすることを避けるためです。

4

2 に答える 2

1

スキャンではbyUNIQUE 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()MySQL5.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 に答える