ユニークインデックスはNULLの重複を許してしまう件

公開日: : 最終更新日:2013/11/12 SQL

記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

以下のようにユニークインデックスを設定する。


postgres_test_development=# \d urls
Table "public.urls"
Column | Type | Modifiers
--------+------------------------+---------------------------------------------------
id | integer | not null default nextval('urls_id_seq'::regclass)
url | character varying(255) |
host | character varying(255) |
Indexes:
"urls_pkey" PRIMARY KEY, btree (id)
"index_urls_on_url_and_host" UNIQUE, btree (url, host)

$ ruby script/console
Loading development environment (Rails 2.0.2)
>> Url.find(:all)
=> []
>> Url.create
=> #<Url id: 1, url: nil, host: nil>
>> Url.create
=> #<Url id: 2, url: nil, host: nil>
>> Url.create
=> #<Url id: 3, url: nil, host: nil>
>> Url.find(:all)
=> [#<Url id: 1, url: nil, host: nil>, #<Url id: 2, url: nil, host: nil>, #<Url id: 3, url: nil, host: nil>]

ありゃりゃ、NULLの重複は許しちゃうのか。


>> Url.create :url=>"xxx", :host=>"yyy"
=> #<Url id: 4, url: "xxx", host: "yyy">
>> Url.create :url=>"xxx", :host=>"yyy"
ActiveRecord::StatementInvalid: PGError: ERROR: duplicate key violates unique constraint "index_urls_on_url_and_host"

こういう重複は当然弾かれる。


>> Url.create :url=>"xxx", :host=>nil
=> #<Url id: 8, url: "xxx", host: nil>
>> Url.create :url=>"xxx", :host=>nil
=> #<Url id: 9, url: "xxx", host: nil>
>> Url.create :url=>"xxx", :host=>nil
=> #<Url id: 10, url: "xxx", host: nil>

あー、こういう重複も許しちゃうのね。


postgres_test_development=# SELECT * FROM urls;
id | url | host
----+-----+------
1 | |
2 | |
3 | |
4 | xxx | yyy
8 | xxx |
9 | xxx |
10 | xxx |
(7 rows)

んー、NULLの重複も弾きたいのだけど、何か良い方法はないものか…。

関連記事

サンフランシスコのピア39にあるチャウダーズでクラムチャウダーを食す!

lolipop アップルの開発者向けイベント「WWDC2014」

ミスドのカルピスドーナツとカルピスポンデリングを食べてみた!

ミスドで期間限定のカルピスコラボ商品「カルピスドーナツ」と「カルピ

十三カレー計画で牛すじカレーネギのせを食す!(大阪・十三)

「iPhoneアプリ開発キャンプ@大阪」のランチで、十三カレー計画

大阪・難波の加寿屋 法善寺でかすうどんを食す。ランチタイムはおにぎり2個まで無料!

大阪・難波の加寿屋 法善寺 (かすうどん KASUYA)で、かす

ライブドアブログで運営していた「あきお商店」を「卵は世界である」に改名しました

少し前からライブドアブログで「あきお商店」というブログをやって

→もっと見る

PAGE TOP ↑