11

アプリケーション構成テーブルを 1 行に制限する簡単な方法を探しています。サブクエリを含む仮想列、または上にマテリアライズドビューを使用してこれを実行できることはわかっていますが、実際には単純なテーブルであり、テーブルを作成するよりも実装に多くの行を必要としない制約が必要です。

私が考えた最も簡単な方法は、ID フィールドを 1 に設定し、ID が 1 でなければならないというチェック制約です。 UNIQUE_FIELD = MAX(UNIQUE_FIELD) のチェック制約のように、これは許可されていません。

4

3 に答える 3

17

最も単純なのは、定数に対する一意の関数ベースのインデックスです

> create unique index table_uk on one_row_table ('1');

代替案:

テーブルではなく、DUAL のビューを持つことができます。これは、UPDATE が実際には CREATE OR REPLACE VIEW になることを意味しますが、これは適切ではない可能性があります。パッケージ本体またはグローバル アプリケーション コンテキストから値を返す関数は、無効化の問題が発生する場合の回避策になる可能性があります。

11g では、READ ONLY テーブル (以前のバージョンでは、読み取り専用テーブルスペース内のテーブル) がオプションです。

于 2011-03-29T22:46:06.470 に答える
6

以下にいくつかのオプションを示します。

  • そのテーブルに対する INSERT 権限を取り消します。
  • 手順を通じて構成テーブルへのすべてのアクセスを管理する
  • 構成テーブルを、チェック制約 (col=1) と一意制約のある列を非表示にするビューに置き換えます。
  • とにかくその具体化されたビューを作成する
  • 例外をスローするINSERTで発生するテーブルトリガーを作成します
  • テーブル構造を再考し、FROM_DATE を追加して、テーブルが更新されないようにしますが、毎回新しい行を作成します。現在の構成は、from_date が最も高い行になります。そのテーブルに対する current_config ビューが役立ちます。
  • テーブルを として定義されたビューに置き換えますSELECT 1024 as buffer_size, '/var/tmp' as temp_dir, 'other constant' as other_constant from dual。これは確実な解決策ではありません。
于 2011-03-29T20:10:41.490 に答える
0
CREATE TABLE Singleton
(x INTEGER NOT NULL UNIQUE CHECK (x = 1),
 col1 INTEGER NOT NULL);

(未テスト)

SQL には、属性の空のセットをキーとして指定するための簡潔な構文がありません。冗長な余分な列が不要になるため、残念です。ここで有効なキーは実際には空のセットです。そのため、x の制約に PRIMARY KEY の代わりに UNIQUE 制約を使用しました。

于 2011-03-30T08:15:38.427 に答える