2009-07-01 2 views
4

テーブルのプライマリキーのシーケンス番号を使用します。 クエリの目的でプライマリキーを実際に使用しない表がいくつかあります。 しかし、他の列にはインデックスがあります。これらは一意ではないインデックスです。 クエリでは、これらの非主キー列をWHERE条件で使用します。Oracle - テーブルに主キーを持たないという効果はありますか?

だから、私は本当にそのようなテーブルにプライマリキーを持つことのメリットはありません。 SQL 2000での私の経験は、いくつかの主キーを持つテーブルを複製することでした。 それ以外の場合はそうではありません。

私はOracle 10gR2を使用しています。 の主なキーを持っていないテーブルを持つような副作用があるかどうかを知りたいです。

答えて

3

私の頭の上には、一意のキーがない外来キーを持つことができないので、テーブルを他のテーブルにリンクする方法はありません。このテーブルにアクセスするすべてのコードは、シフトされた参照のためにまったく動作しないか、または異なる方法で実行されるため、事実が自明ではない後にこれを変更します。また、ユニ・インデックスでは、行が内容に関係なく分割されているため、ユニークなインデックスがパフォーマンスに優れていることが、5年以上前には分かったと思います。

6

クエリの目的で主キーを実際に使用しない表がいくつかあります。

あなたは決してそれを使用していない場合、なぜあなたはすべてのシーケンスを持っていますか? すべてのテーブルは、レコードを一意に識別する何かを持っていなければなりません。人工のインクリメンタルシーケンス(別名surrogate key)である必要はありません。natural keyの組み合わせかもしれません。特定の種類の一意のキー(候補キー)でアクセスするクエリが常に存在します。つまり、インデックスが必要な場合があり、インデックスを一意にすることもできます。アプリケーションが破損しているDBにできないこと、あなたが決して重複した値を持つことになりますことを確認

  1. (:

    すべての永続的な(非一時的)のテーブルにPK制約を強制する他の利点があります。 )

  2. 外部ツールが自動ERモデリングを実行するのを助ける
  3. 最後に、FKの制約を許しません!
+1

+1引用。 「主キーがない場合は、テーブルではありません」 :-) –

+1

ユニークでは外部キーが許可されているため、PKの必要はありません –

8

テーブルにはプライマリキーは必要ありません。データベース内のすべての行に、Oracleがストレージおよび特定の内部参照に使用する暗黙の一意のデータ・ポイントがあるため、表に明示的なキーを持たないデータベースには何の影響もありません。これがROWID疑似列です。 ROWIDは、データベース内のすべての行を一意に識別するデータです。例外はいくつかあります。

私のデータベースで次の問合せは、示されたデータを返します。

 
select rowid from user$ where rownum <= 5; 

AAAAAKAABAAAAFlAAC 
AAAAAKAABAAAAFlAAD 
AAAAAKAABAAAAFiAAD 
AAAAAKAABAAAAFlAAE 
AAAAAKAABAAAAFlAAF 

テーブルの上にキーを持っている厳密には必要ではありません。私が照会したばかりのOracle10gデータベースには、プライマリまたはユニークキーを持たない569個のシステムテーブルがあります。 DBAと開発者がデータベース表にキーを作成する方法を決定します。私のプロジェクトの開発者は、その有用性や健全性に関係なく、常にプライマリキーを作成します。 DBAとして、私は彼らが理にかなっているところだけキーを作成します。

敬具、

オーパス

+0

データウェアハウスETL/ELTスキーマの場合のように、テーブルに一時データがある場合や、単純に生データ(例えばネットワークデバイスから)を受け入れることは意味のあるPKではありません。シーケンス生成番号を追加することもできますが、同様にROWIDを使用することもできます。 –

関連する問題