Landscape トップページ | < 前の日 2003-07-29 2003-07-31 次の日 2003-08-02 >

Landscape - エンジニアのメモ 2003-07-31

SQL Server の UNIQUE 制約は SQL 標準に準拠してない


* SQL Server の UNIQUE 制約は SQL 標準に準拠してない

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [MS SQL Server]

SQL Server2000 では、NULL 同士でもユニーク制約 (一意性制約)にひっかかる。SQL Server2000 にこんな落とし穴があるなんて思わなかった。危ないところだった。

PostgreSQL 7.3.2 ユーザガイド Chapter 2. データ定義 2.4.3. 一意性制約
http://www.postgresql.jp/document/pg732doc/user/ddl-constrai ...
一般に、制約の対象となる列について、同じ値をもつ行が 2 行以上ある場合は、
一意性制約違反になります。
しかし、ここでは NULL 値は等価とは見なされません。
つまり、複数列での一意性制約では、制約対象の列の少なくとも 1 つに
NULL 値をもつ行を無限に格納することができるということです。
この振る舞いは SQL 標準に準拠していますが、この規則に従わない
SQL データベースもあるそうです。
ですから、移植する予定のアプリケーションを開発する際には注意してください。

- 検証 SQL

DROP TABLE uniq_test;
CREATE TABLE uniq_test(
  int1 int,
  int2 int,
  UNIQUE (int1, int2)
);
INSERT INTO uniq_test (int1, int2) VALUES (NULL, 1);
INSERT INTO uniq_test (int1, int2) VALUES (NULL, 1);

- PostgreSQL 7.2.1 での結果

hiroaki=> DROP TABLE uniq_test;
DROP
hiroaki=> CREATE TABLE uniq_test(
hiroaki(>  int1 int,
hiroaki(>  int2 int,
hiroaki(>  UNIQUE (int1, int2)
hiroaki(> );
NOTICE:  CREATE TABLE / UNIQUE will create implicit index 'uniq_test_int1_key' for table 'uniq_test'
CREATE
hiroaki=> INSERT INTO uniq_test (int1, int2) VALUES (NULL, 1);
INSERT 31376096 1
hiroaki=> INSERT INTO uniq_test (int1, int2) VALUES (NULL, 1);
INSERT 31376097 1

- SQL Server2000 での結果

(1 件処理されました)

サーバー : メッセージ 2627、レベル 14、状態 2、行 1
UNIQUE KEY 違反、制約 'UQ__uniq_test__65851878': オブジェクト 'uniq_test' には重複したキーは挿入できません。
ステートメントは終了されました。

NULL は NULL なんだから重複って概念はおかしい。

すべての記事の見出し (全1029件)
全カテゴリの一覧と記事の数
カテゴリごとに記事をまとめ読みできます。記事の表題だけを見たい場合は、すべての記事の見出し (カテゴリ別表示) へ。

直近30日分の記事
2007-04-23 (Mon)
2007-03-07 (Wed)
2007-02-27 (Tue)
2007-01-17 (Wed)
2007-01-15 (Mon)
2007-01-14 (Sun)
2007-01-08 (Mon)
2006-12-01 (Fri)
2006-11-22 (Wed)
2006-11-20 (Mon)
2006-11-19 (Sun)
2006-09-30 (Sat)
2006-08-29 (Tue)
2006-08-04 (Fri)
2006-07-27 (Thu)
2006-07-23 (Sun)
2006-07-17 (Mon)
2006-07-10 (Mon)
2006-07-06 (Thu)
2006-07-03 (Mon)
2006-06-29 (Thu)
2006-06-28 (Wed)
2006-06-27 (Tue)
2006-06-25 (Sun)
2006-06-19 (Mon)
2006-06-18 (Sun)
2006-06-15 (Thu)
2006-06-11 (Sun)
2006-06-01 (Thu)
2006-05-30 (Tue)
プロファイル
斎藤 宏明。エンジニアです。宇都宮市に住んでいます。
リンク
RSS
スポンサードリンク
Powered by
さくらインターネット

© 斎藤 宏明 Saito Hiroaki Gmail Address
Landscape - エンジニアのメモ http://sonic64.com/
Landscape はランドスケープと読みます。
ひらがなだと らんどすけーぷ です。