QA@IT
«質問へ戻る

質問を投稿

UNIQUE制約が付いたカラムに安全に値を追加する方法を教えてください

MySQL 5.6を使っています。

こんなテーブルがあります。

CREATE TABLE tb_user (
  user_id INT NOT NULL AUTO_INCREMENT,
  email VARCHAR(100) NOT NULL COMMENT 'メールアドレス',
  PRIMARY KEY (user_id),
  UNIQUE (email)
) ENGINE=InnoDB CHARACTER SET utf8;

このテーブルに安全にメールアドレスを追加するには、このようにするのでしょうか。

BEGIN;

SELECT user_id FROM tb_user FOR UPDATE;

SELECT user_id FROM tb_user WHERE email = 'hoge@hoge.com';

-- レコードがあれば

ROLLBACK;

-- レコードがなければ

INSERT INTO tb_user (email) VALUES ('hoge@hoge.com');

COMMIT;

この場合、SELECT user_id FROM tb_user FOR UPDATE;で全レコードに専有ロックをかけているのが気になりますが、仕方ないのでしょうか。

MySQL 5.6を使っています。

こんなテーブルがあります。

```sql
CREATE TABLE tb_user (
  user_id INT NOT NULL AUTO_INCREMENT,
  email VARCHAR(100) NOT NULL COMMENT 'メールアドレス',
  PRIMARY KEY (user_id),
  UNIQUE (email)
) ENGINE=InnoDB CHARACTER SET utf8;
```

このテーブルに安全にメールアドレスを追加するには、このようにするのでしょうか。

```sql
BEGIN;

SELECT user_id FROM tb_user FOR UPDATE;

SELECT user_id FROM tb_user WHERE email = 'hoge@hoge.com';

-- レコードがあれば

ROLLBACK;

-- レコードがなければ

INSERT INTO tb_user (email) VALUES ('hoge@hoge.com');

COMMIT;
```

この場合、`SELECT user_id FROM tb_user FOR UPDATE;`で全レコードに専有ロックをかけているのが気になりますが、仕方ないのでしょうか。