63469
これまで一度もUNIQUE制約を手動で設定したことはないのですが、ふと、一意な値を格納するカラムにはUNIQUE制約をつけた方が良いのかな、と思ったので質問します。

* * *

**Q1.一意な値を格納するカラムには、UNIQUE制約を必ずつけた方が良いですか？**  
例えばuserメールアドレスを(重複不可で)格納する場合、UNIQUE制約をつけた方が良いですか？

* * *

**Q2.一意な値を格納するカラムに、UNIQUE制約をつけない方が良い場合はありますか？**

* * *

**Q3.UNIQUE制約をつけるメリットは何ですか？**  
インデックス的役割を果たすこと？

* * *

**Q4.UNIQUE制約を設定しても、INSERT時の処理は変わらない？(処理が楽になるわけではない？)**  
UNIQUE制約を設定していない現在でも、INSERT前にメールアドレスをSELECT後、存在してなければINSERT処理しています。UNIQUE制約を設定しても行うことは変わらない？？
CC BY-SA 4.0
2020-03-01T02:27:26.440
63464
2020-03-01T08:20:35.170
7886
question
mysql
一意な値を格納するカラムには、UNIQUE制約を必ずつけた方が良いですか？
こんにちは、以下回答となります。ご参考にしていただければ幸いです。

A1.
INSERTにかかるコストが増えるので、他の手法で一意性が担保されている、つけても意味がないというケースならつけない場合もあります。格納されている値が例えばの例のようなメールアドレスで、

  * ユーザーがフォームから入力するメールアドレス
  * かつそれがシステム上、ユーザーの確認のために使われている

のなら、つけたほうがよいと思います。逆に自宅の電話番号なんてのもユニークになりそうですが、とくにシステム上に意味がなく重複しても困らないなら制約をつける必要はありません。

A2.
とくに一意性がシステム上意味をもたない場合はパフォーマンスの観点からつける必要はありません。また、テーブルを複製するときなどは制約を後からつけることで作業時間を減らせると思います。

A3.
DBMS側で値の一意性を担保してくれるようになります。これは効率的にも作業量的にもプログラムで行うよりは有利です。またUNIQUEが指定されたフィールドへの検索はその値が見つかった時点で終了するので効率がよくなります。

A4.
事前にSELECTしなくても、INSERTしたときに戻ってくる例外で、処理することができるようになると思いますがあまりやりませんね。(SELECTした値を後で使うケースが大半、例外処理のオーバーヘッドが大きいなどの理由から)
CC BY-SA 4.0
2020-03-01T08:20:35.170
63469
2020-03-01T08:20:35.170
37777
63464
answer