• ベストアンサー

インデックスについて

オラクルのインデックスについて教えてください。 ObjectBrowserというソフトでオラクルDBを管理しているのですが、 インデックスとCONSTRAINTというものの違いが良くわかりません。 現在ObjectBrowserで、インデックスを重複不可にすることで、そのテーブルの 主キーとしています。しかし、CONSTRAINTでPRIMARYKEYも設定できることに 最近気づきました。 ObjectBrowserに限らず、この違いについて教えてもらえないでしょうか? どのような時にインデックスを使い、CONSTRAINTのPRIMARYKEYはこのような時に 使用するという風にお教えていただければ幸いです。 何分、データベース初心者なもので... 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • vient
  • ベストアンサー率28% (2/7)
回答No.2

CONSTRAINTと言うのは、日本語で言うと制約で、INDEXは索引です。 制約には、主キー制約と一意制約があります(他にもありますけど省略します)。索引には、一意(重複不可)と重不可があります。 制約と索引の違いは、制約はデータの整合性を保証するもので、索引は検索スピードを向上させるものです。 主キー制約は、一意でありかつNOT NULLでかつ、一つの表に一つだけです。 一意制約は、一意であるのは同じですが、NULLも認めますし、一つの表にいくつも作ることが出来ます。 以上を踏まえて、データの検索スピードを向上するときにはインデックスを作成します。また、主キー制約というのは、一意キーのうち代表的なものの一つと考えるといいです。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

レコードの一意にするためにつける主キーには、通常PRIMARYKEYの属性をつけます。なお、これは1つのテーブルに1つしかつけることができません。 主キーのほかにも一意となるフィールド(または組み合わせ)があるのであれば、ユニークインデックスをつける、というのが普通だと思います。 #MS-SQLServerの古いバージョンではユニークインデックスしかなかったらしいですが。

関連するQ&A

  • インデックス「いいえ」 インデックス「はい (重複

    アクセスのテーブルについて質問なんですが インデックス「いいえ」 インデックス「はい (重複あり)」 の違いはなんでしょう? はい (重複なし)にすると、インデックス「いいえ」 と見た目は変わらないけど、 検索や並べ替えをする時に若干早くなるって事でしょうか? インデックス「はい (重複なし)」にした場合は、 主キーと同様、重複した値を入力できないので 違いが一目瞭然にわかりました。

  • ユニークインデックスについて

    仕事の関係で、テーブル定義の際にユニークインデックスをどの列の組み合わせにするのか考える必要があるのですが、今までユニークインデックスの存在自体知らず、困っています。 自分自身でネット等で調べた結果以下のことは理解できました。  1.ユニークインデックスで指定された列は値が一意でなければならない。  2.主キーの列にはNULL値は不可だが、ユニークインデックスの列はNULL値も可。  3.主キーは一つのテーブルにつき、一つしか設定できないが、    ユニークインデックスは複数設定できる。(同じ列は指定できない)  4.主キー設定時、実は暗黙的にユニークインデックスとNOT NULL制約が作成されている。 ここまでは分かったのですが、主キーとは別で、明示的にユニークインデックスを指定する必要性とはなんなのでしょうか? 主キーとは別で明示的に指定した方が良い場合と、その実例をどなたか教えて頂けないでしょうか? よろしくお願いします。

  • インデックスの削除と、インデック名のつけ方について

    PostgreSQL8.2.24を使っています。 インデックスの削除と、インデック名のつけ方についてお聞きしたいです。 まず、削除ですが、create index tbl_fld_key on tbl (fld); としたものは、drop index tbl_fld_key;で削除できますが、 create tbl ( fld integer, unique key (fld) ); としたものは、drop index tbl_fld_keyで削除できません。 インデックス名は\diコマンドで表示されている tbk_fld_keyです。 メッセージは次のとおりです。 db =# drop index tbl_fld_key; ERROR: cannot drop index tbl_fld_key because constraint tbl_fld_key on table tbl requires it HINT: You may drop constraint tbl_fld_key on table tbl instead. あと、PostgreSQLのインデック名の規則について インデックス名を見ただけで判断できるように作られるようですが PRIMARY KEY テーブル名_フィールド名_pkey UNIQUE    テーブル名_フィールド名_key 重複可    テーブル名_フィールド名_??? <<--- この部分が知りたいです。

  • INDEXの無効化

    Oracle11gを使用しています。 制約と同じようにINDEXも無効化することは出来るのでしょうか。 テーブル名と、フラグ(無効化/有効化)を引数として、制約、INDEXの無効化、有効化 を行うプログラムを作成したいと考えています。 制約は、「ALTER TARBLE テーブル名 DISABLE(又はENABLE ) CONSTRAINT 制約名」 にて無効化、有効化することが出来ますが、INDEXも同じように無効化、有効化することは 出来るのでしょうか? よろしくお願いします。

  • インデックスの作り方

    MySQL4.1.19を使っているのですが、ユニークなインデックスの作り方で困っています。 例えば、 create table dttest ( a int NOT NULL , b int NOT NULL , c int NOT NULL , d int NOT NULL , CONSTRAINT PK_dttest PRIMARY KEY ( b ) ) type=InnoDB; というテーブルがあったとして、 aフィールドはユニークのインデックスを作り cフィールドは、重複可能なインデックスを作りには どうすればよいのでしょうか? 初歩的な質問で申し訳ありませんが、 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Access 主キーの解除について

    'テーブル[売上]に主キーを設定します DoCmd.RunSQL "ALTER TABLE 売上 ADD PRIMARY KEY (No);" 'テーブル[売上]の主キーを解除します DoCmd.RunSQL "DROP INDEX PRIMARYKEY ON [売上];" Access2007を使用しています。 VBAで主キーの設定・解除をするため、上記のプログラムを組みました。動かしてみると、設定はできたのですが、解除のプログラムで以下のエラーメッセージがでました。 実行時エラー'3372': テーブル'売上'にインデックス'PRIMARYKEY'が見つかりませんでした。 見つからないと出たので売上テーブルを開き確認をしたところ、ちゃんと主キー設定されていました。 そこで手動で主キーの設定しなおしプログラムを動かすと、解除プログラムが動きました。 手動で設定すると動くのですが、何故プログラムで設定した主キーでは動かないのでしょうか。 ご教授のほど、よろしくお願いします。

  • 主キーとインデックスの違いについて

    はじめまして。 SqlServerのテーブル作成をしていますが、 主キーとインデックスの違いがよく分かりません。 いつも主キーの設定は行っていますが、インデックスの設定も必要なのでしょうか。(パフォーマンスの向上の為?) 基本的な事ですみませんが ご教授お願いします。

  • 主キー、インデックスが作成できない

    お世話になります。 SQLserver2000とACCESS(フロント)で使っております。 主キーもインデックスも設定していなかったテーブルに エンタープライズマネージャから主キーを設定しようとしたのですが、保存しようとすると以下のエラーが出てしまいます。 もともと更新クエリを作成したのですが、”更新可能なクエリであることが必要です。”とエラーが出てしまい、いろいろ調べるうちに主キーを設定していないから??と思い、設定しようとしたのですがうまくいきません。。宜しくお願いします。 ■エラー内容 テーブル 'テーブル名 (ユーザー名)' - インデックス 'インデックス名' を作成できません。 ODBC エラー : [Microsoft][ODBC SQL Server Driver][SQL Server]インデックス ID 1 で重複したキーが見つかったので、CREATE UNIQUE INDEX は終了しました。もっとも重要な主キーは 'XXXX-00XXXX-00-A1 ' です。 [Microsoft][ODBC SQL Server Driver][SQL Server]制約を作成できませんでした。以前のエラーを調べてください。 [Microsoft][ODBC SQL Server Driver][SQL Server]ステートメントは終了されました。

  • ACCESSにインデックス(主キー)のあるテーブルを作りたい

    元データがEXCELでそのデータを利用し、 ACCESS内にマスター用(品目マスタ)のテーブルを作り、 1番目の部品コードというフィールドを インデックス/主キー(重複しない)にして 2番目、3番目の項目の値をえられるように しようとしていますが、EXCELからの元データを インポートしようとしても部品コードフィールドが インデックス/主キーに設定できません。 EXCEL内で部品コードが重複しないように削った つもりです。 部品コードが重複していなくても、いけない文字列 があってインデックス/主キーにできないのでしょうか? ※詳細 以下のようなテーブルをつくり、 284-A80と入力したら製品部品名称の「基板」と いう値や製品分類の「LED」という値を得ようと している。 部品コード    製品部品名称   製品分類 284-A80      基板        LED 7841P20      ヨーク       ブザー CL-270-CD     LED         LED HSDL-3201#001   センサー     センサー ……約17000レコードぐらい ただし、部品コードの値がもっとごちゃごちゃして いて、「*」、「スペース」「#」「_」「/」などや カタカナ文字のものも含まれていたりします。 なぜ、上記の部品コードをインデックス/主キーとして 設定をおこなったテーブルとしてインポート できないのですか?

  • Access結合後の短いテキスト型のインデックス

    Accessの検索にて、テーブルA LEFT JOIN テーブルB で外部結合し、 WHERE句でテーブルBの短いテキスト型を抽出条件にすると、検索が遅くなります。 【テーブル定義】 テーブルA( ・年月日(日付/時刻、重複ありインデックス) ・コード(短テキスト、重複ありインデックス) ・属性あ(短テキスト、重複ありインデックス) ・属性い(短テキスト、重複ありインデックス) ) テーブルB( ・コード(短テキスト、主KEY) ・属性う(短テキスト、重複ありインデックス) ・属性え(数値、重複ありインデックス) ) 【件数】 テーブルA:15万件 テーブルB:500件 =====SQLここから===== SELECT * FROM テーブルA LEFT JOIN テーブルB ON テーブルA.コード = テーブルB.コード WHERE 属性あ IS NULL AND 属性い = 'あああ' AND 属性う = 'アアア' AND 属性え = 1 GROUP BY 年月日、 属性う =====SQLここまで===== この検索SQLは遅い(1分30秒くらい)のですが 『AND 属性う = 'アアア'』を削除すると 10秒くらいに速くなります。 ”属性う” のインデックスが効いてないように見えるのですが どのようにチューニングしたら速くなるでしょうか? エクセルからLAN越しにDAO接続してSQL実行してます。 AccessはOffice365(バージョン1902)です。