ユニークインデックスは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の重複も弾きたいのだけど、何か良い方法はないものか…。
関連記事
- PREV
- ブロック付きHash.new
- NEXT
- rubyからpostgresを扱えるようにする