キムラデービーブログ

オープンソースデータベースを加速する「キムラデービー」のブログです。カレー日記を兼ねてます。なお著者は2010-06-01より日本オラクルに在籍していますが、本サイト(ブログ、またはウェブサイト)において示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。
<< 【T6】ライトニングトーク InterBaseあるある | main | [書評] プロのための Linuxシステム構築・運用技術 >>
DB2での一意インデックス(Unique index)の実装について
0
    JUGEMテーマ:コンピュータ


    ということで、今回はDB2と、それに似ているMS SQL Serverの一意インデックスについて。

    DB2(とMS SQL Server)ではNULLも一つの「ユニークな値」としてカウントされるため、重複登録はできません。

    db2 => create table t1(i1 int)
    db2 => create unique index idx_t1 on t1(i1)
    db2 => insert into t1 values(1)
    db2 => insert into t1 values(null)
    db2 => insert into t1 values(null)
    DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
    ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
    SQL0803N INSERT ステートメント、UPDATE ステートメントの 1 つ以上の値、および
    DELETE ステートメントが原因で発生した外部キーの更新は無効です。これは、"1"
    で識別される主キー、ユニーク制約、またはユニーク索引が表 "MEIJI.T1"
    が索引キーに対して重複する値を持つことを制限しているためです。 SQLSTATE=23505
    db2 => select * from t1

    I1
    -----------
    1
    -

    2 レコードが選択されました。

    複合カラムにおいても同じようにNULLを一つの「ユニークな値」として扱います。そのため、
    構成するすべてのカラムがNULLの場合でも重複登録できません。

    db2 => create table t2(i1 int, i2 int)
    db2 => create unique index idx_t2 on t2(i1, i2)
    db2 => insert into t2 values(1,1)
    db2 => insert into t2 values(1,2)
    db2 => insert into t2 values(1,null)
    db2 => insert into t2 values(1,null)
    DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
    ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
    SQL0803N INSERT ステートメント、UPDATE ステートメントの 1 つ以上の値、および
    DELETE ステートメントが原因で発生した外部キーの更新は無効です。これは、"1"
    で識別される主キー、ユニーク制約、またはユニーク索引が表 "MEIJI.T2"
    が索引キーに対して重複する値を持つことを制限しているためです。 SQLSTATE=23505
    db2 => insert into t2 values(null,null)
    db2 => insert into t2 values(null,null)
    DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
    ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
    SQL0803N INSERT ステートメント、UPDATE ステートメントの 1 つ以上の値、および
    DELETE ステートメントが原因で発生した外部キーの更新は無効です。これは、"1"
    で識別される主キー、ユニーク制約、またはユニーク索引が表 "MEIJI.T2"
    が索引キーに対して重複する値を持つことを制限しているためです。 SQLSTATE=23505
    db2 => select * from t2

    I1 I2
    ----------- -----------
    1 1
    1 2
    1 -
    - -

    4 レコードが選択されました。

    さて、今回一意インデックス定義をCREATE TABLEとは別に宣言していることにお気づきでしょうか?

    実は一般的なデータベースでは一意制約(UNIQUE CONSTRAINT)と一意インデックス(UNIQUE INDEX)は、
    仕様的には等価なので、前回、前々回と代用してきました。(一意制約を満たすために、内部的に一意インデックスを用います)

    しかしながら、実はDB2だけ、一意制約と一意インデックスは仕様的に違うために、今回は厳密に一意インデックスで定義しています。DB2の一意制約はNULLを許しません。そのため、一意制約の構成列はすべてNOT NULLとして定義する必要があります。

    db2 => create table t3(i1 int, unique(i1))
    DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
    ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
    SQL0542N "I1" という名前の列は、NULL
    値を含む可能性があるので、主キーまたはユニーク・キー制約の列にすることができません。 SQLSTATE=42831

    これは仕様としてはかなり厳しいものです。そのため、他のデータベースからDB2にテーブル定義を持ってくる場合は一意制約は一意インデックスに書き直した方が、スムーズにことが運びます。
    | meijik | DB2 | 23:41 | comments(0) | trackbacks(0) | - | - |









    トラックバック機能は終了しました。
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    << February 2020 >>
    + RECOMMEND
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊 (JUGEMレビュー »)

    100人のうちの一人としてミックさんの本を推薦しています。
    + RECOMMEND
    MySQL 5.1 Plugin Development
    MySQL 5.1 Plugin Development (JUGEMレビュー »)
    Andrew Hutchings,Sergei Golubchik
    MySQL 5.1 のプラグインを作るならこれ!
    + RECOMMEND
    AWKを256倍使うための本 (Ascii 256倍)
    AWKを256倍使うための本 (Ascii 256倍) (JUGEMレビュー »)
    志村 拓,鷲北 賢,西村 克信
    ここにきてまさかの復刊。15〜16年前の本ですが、いまでも十分役立ちますよ!!
    + RECOMMEND
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION)
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION) (JUGEMレビュー »)
    松信 嘉範
    Linux-DB システム構築の新スタンダード。DB Magazine人気連載、待望の書籍化です!!
    + RECOMMEND
    + RECOMMEND
    超・極める!MySQL
    超・極める!MySQL (JUGEMレビュー »)
    坂井 恵,志村 和彦,ひろせ まさあき,松信 嘉範
    内容は少々古くなりましたが、内部説明があり、いろいろ面白いです。
    + RECOMMEND
    The Root of .NET Framework
    The Root of .NET Framework (JUGEMレビュー »)
    荒井 省三
    .NETの根っこをつかむ、か?
    + RECOMMEND
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド (JUGEMレビュー »)
    奥野 幹也
    これまでにない構築、そして構築後のMySQLのための本。
    + RECOMMEND
    Database Management Systems
    Database Management Systems (JUGEMレビュー »)
    Raghu Ramakrishnan,Johannes Gehrke
    ミックさん連載の参考書籍です。
    + RECOMMEND
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series)
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series) (JUGEMレビュー »)
    W. Richard Stevens,Stephen A. Rago
    必読! といいつつ私が読んだのは初版の日本語訳です。差分はチェックしないといけませんね。
    + RECOMMEND
    + RECOMMEND
    + RECOMMEND
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE (JUGEMレビュー »)

    DELL SX260の換装用に購入。今はコチラのほうが安いですね。
    + RECOMMEND
    情熱プログラマー ソフトウェア開発者の幸せな生き方
    情熱プログラマー ソフトウェア開発者の幸せな生き方 (JUGEMレビュー »)
    Chad Fowler
    OSC2010神戸に出展されたジュンク堂で買いました。
    + RECOMMEND
    Software Design 総集編 【2000~2009】(DVD付)
    Software Design 総集編 【2000~2009】(DVD付) (JUGEMレビュー »)

    メガトン級の過去記事。売り切れる前にお店に急げ!
    + RECOMMEND
    + RECOMMEND
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2 (JUGEMレビュー »)

    Aspire 1410 HDD換装後、昔のHDDはこれにいれます。
    + RECOMMEND
    + RECOMMEND
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22 (JUGEMレビュー »)

    色違い黒(他に青と白があります): メモリは最大4GBとあるが、がんばれば8GBいけるらしい。
    + RECOMMEND
    Firebird 徹底入門
    Firebird 徹底入門 (JUGEMレビュー »)
    木村 明治,はやし つとむ,坂井 恵
    Firebird日本ユーザ会のはやしさん、そしてMyNAから拝借(?) してきた坂井さんとともに書きました。まだ誰も知らないFirebird 2.5や、いままでドキュメントのなかったツール類についてもソースを確認してとりあげた本です。是非ご活用ください。
    + SELECTED ENTRIES
    + RECENT COMMENTS
    • たまたま「プリントヘッドの種類が違います」エラーから復活@MG6230
      meijik (11/20)
    • [ミュージシャンに聴かせたい・弾かせたい!] (4) 山田元気様
      meijik (07/27)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      meijik (03/03)
    • 2019年の木村明治
      田中尚 (01/08)
    • 使い慣れたSQLに潜む実装依存: Firebirdの場合(6) 文字列との結合演算子
      noname (12/10)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 2015年版 InterBaseの歩み
      nakagami (12/06)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      meijik (11/22)
    • 分散DB本読書会第46回メモ「STOP AFTER 10」
      masudahidehiko (09/01)
    + RECENT TRACKBACK
    + CATEGORIES
    + ARCHIVES
    + MOBILE
    qrcode
    + LINKS
    + PROFILE