🖥

MySQL で複数種類の複合ユニーク制約をつける (NULLも許容) (+Railsのマイグレーション例)

2024/01/02に公開

概要

知らなかったが MySQL で複合キーのユニーク制約を付けた場合、nullのあるカラムは許容してくれるみたいだ。

たとえば column_1column_2 で複合ユニーク制約のあるテーブルで、 以下2個のレコードを追加した場合、 ユニーク制約に引っ掛かりそうだが許容してくれる

column_1の値: AAA
column_2の値: NULL
column_1の値: AAA
column_2の値: NULL

こうすると例えば、1テーブルで複数の複合ユニーク制約があっても、問題なく扱うことが出来る

たとえば column_1 / column_2 の組み合わせと column_3 / column_4 の組み合わせでそれぞれ複合ユニーク制約がある場合、片方の組み合わせはNULLでも問題なくなるのだ

column_1の値: NULL
column_2の値: NULL
column_3の値: YES
column_4の値: YES
column_1の値: NULL
column_2の値: NULL
column_3の値: YES
column_4の値: NO

Ruby on Rails でのマイグレーションの例

普通に複合ユニーク制約を複数追加するだけで良い

class AddUniquenessToExampleTable < ActiveRecord::Migration[7.1]
  def change
    add_index :examples, [:column_1, :column_2], unique: true, name: 'index_examples_uniqueness_1'
    add_index :examinees, [:column_3, :column_4], unique: true, name: 'index_examples_uniqueness_2'
  end
end

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2023-11-24

Discussion