none
UNIQUEによる一意性制約について質問 RRS feed

  • 質問

  • PRIMARY KEYによる一意性制約はPRIMARY KEYに指定された列にnot Nullをつけるのでその行が他の行と同じものが出来ないというのはわかるのですが。
    UNIQUEに指定された列は行に複数のNullを持つことが出来るのでNullの行が何行も出来てしまい一意性の列とはいえないように思えます。
    なぜUNIQUEで指定された列は一意行と指定されるのでしょうか?
    2009年4月8日 14:46

回答

  • こんにちは、naginoです。

    この件、議論のベースをどこにおくかによって話が変わる点にもご注意ください。



    ● SQL Server について考える場合
    trapemiya 様が既に回答されていますが、SQL Server では UNIQUE 制約の列に Null 値は 1 つのみ許されます。
    http://technet.microsoft.com/ja-jp/library/ms191166.aspx



    ● 標準 SQL もしくは RDBMS 全般について考える場合
    ちなみに、記憶では標準 SQL(SQL89 以降) における UNIQUE 制約では、Null 値は複数許されます。
    (正式なドキュメントは有料です。)
    3 値理論の下では Null は他の Null を含むいかなる値と比較しても True にはなりませんので、「重複」とはみなされないということのようです。

    そのため UNIQUE 制約は現実には実装依存です。
    例えば Oracle ですと、複数の Null 値が許されています。
    http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05750-03/clauses.htm#5789

    PostgreSQL なども、多くが同様の実装になっていたかと思います。



    この点に関しては、SQL Server は特殊だと言えます。
    ご参考になれば幸いです。

    MCITP(Database Developer/Database Administrator)
    • 回答としてマーク quisp 2009年4月9日 4:24
    2009年4月8日 23:52
  • ご質問の内容を理解しきれていないのですが、UNIQUE制約を付けるとNullであっても各行で重複できなくなります。したがって、同一列がNullである行が複数できることはないと思うのですが・・・


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク quisp 2009年4月9日 4:24
    2009年4月8日 15:49

すべての返信

  • ご質問の内容を理解しきれていないのですが、UNIQUE制約を付けるとNullであっても各行で重複できなくなります。したがって、同一列がNullである行が複数できることはないと思うのですが・・・


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク quisp 2009年4月9日 4:24
    2009年4月8日 15:49
  • こんにちは、naginoです。

    この件、議論のベースをどこにおくかによって話が変わる点にもご注意ください。



    ● SQL Server について考える場合
    trapemiya 様が既に回答されていますが、SQL Server では UNIQUE 制約の列に Null 値は 1 つのみ許されます。
    http://technet.microsoft.com/ja-jp/library/ms191166.aspx



    ● 標準 SQL もしくは RDBMS 全般について考える場合
    ちなみに、記憶では標準 SQL(SQL89 以降) における UNIQUE 制約では、Null 値は複数許されます。
    (正式なドキュメントは有料です。)
    3 値理論の下では Null は他の Null を含むいかなる値と比較しても True にはなりませんので、「重複」とはみなされないということのようです。

    そのため UNIQUE 制約は現実には実装依存です。
    例えば Oracle ですと、複数の Null 値が許されています。
    http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05750-03/clauses.htm#5789

    PostgreSQL なども、多くが同様の実装になっていたかと思います。



    この点に関しては、SQL Server は特殊だと言えます。
    ご参考になれば幸いです。

    MCITP(Database Developer/Database Administrator)
    • 回答としてマーク quisp 2009年4月9日 4:24
    2009年4月8日 23:52