2009-07-30 8 views
15

そのオラクルが主キーの自動インクリメント機能をサポートしていないのはなぜですか?なぜoracleにプライマリ・キーの自動インクリメント機能がないのですか?

シーケンスとトリガーの助けを借りて同じ機能を実現できますが、なぜoracleは内部的にシーケンスとトリガーを作成するautoincrementキーワードを導入しなかったのでしょうか。私はオラクルの人がこれについて間違いなく考えていたと思う。この機能を提供していない理由があるはずです。何かご意見は?

答えて

15

用語は多分です。 'AUTOINCREMENT'はレコード '103'がレコード '102'と '104'の間に作成されることを意味します。クラスタ環境では、必ずしもシーケンスの場合ではありません。一方のノードは '100'、 '101'、 '102'を挿入し、他方のノードは '110'、 '111'、 '112'を挿入している。 [もちろん、シーケンスという用語には同じ意味があります。]

シーケンスモデルに従わないことを選択すると、ロックとシリアル化の問題が発生します。あるインサートが別のインサートのコミット/ロールバックを待つようにしてから、次の値が何かを判断するか、それを受け入れますか?トランザクションがロールバックすると、キーにギャップが生じます。

誰かがそのフィールドの特定の値を持つ行を挿入しようとしている(つまり、許可されている、またはDEFAULTのように動作している)場合や、誰かがそのフィールドを更新しようとした場合。誰かが '101'を挿入した場合、自動インクリメントは '102'にジャンプするか、重複した値を試みる危険がありますか?

IMPユーティリティとダイレクトパス書き込みと下位互換性に影響を与えることがあります。

私はそれができないと言っているわけではありません。しかし、私は最終的に誰かがそれを見て、彼らがどこか別の場所で開発時間をより長く費やすことができると決めたのではないかと疑います。


追加する編集:

をオラクル12.1では、IDENTITY列のためのサポートが追加されました。

"ID列には、後続の各INSERT文のシーケンスジェネレータから増減する整数値が割り当てられます。シーケンスジェネレータを設定するには、identity_options句を使用できます。

https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#CJAHJHJC

5

それはsequencesを持っているため、すべての自動インクリメントが実行できます。

+0

壊れたリンク17-06-2014 – guisantogui

+1

更新 - ありがとうございます。 –

1

多くの人がこれに不満を持ちましたが、答えは一般的に、シーケンスとトリガーで簡単に簡単に作成できるということです。

5

これは、さまざまなDBキャンプの間でかなりの時間競合の骨です。データベースシステムが磨かれていて、Oracleとしてうまく構築されているため、この共通して有用な機能を有効にするためには、多くのコードと労力が必要です。

私はちょっとしたインクリメンタル・プライマリ・キー・ビルダー/ファンクション/ツールをツールキットに入れて、Oracleの作業に便利だとお勧めします。あなたの議員を書いて、GUIからこの機能を利用できるようにするか、SQLの1行を使用する必要があるかを教えてください!

+0

実際、Oracleには、あなたが探しているものであるSEQUENCEという概念があります。 –

+4

しかし、自動インクリメントに加えて、プライマリキーのアスペクトを追加する必要があります。 MS-SQLを使用すると、1つのステートメント(または数回のマウスクリック)でこれらの両方を実行できます。私の主張は、MS-SQLでは簡単だということです。 – ajh1138

-1

の配列は、(誰かがシーケンスを更新せずに、データベースに手動でレコードを挿入)を簡単に同期から抜け出すことができます。オラクルはこれまでにこの実装を完了しているはずです。 シーケンスは使いやすく、自動インクリメントほど簡単ではありません(余分なコーディングが必要です)。

関連する問題