2011-01-12 3 views
0

可能性の重複:
adding primary key to sql viewOracleビューに主キーを追加する方法は?

私は、Oracleのビューで主キーを必要とするソフトウェアで働いています。 Oracleビューに主キーを追加することは可能ですか?はいの場合、どうですか?私はこのことについてGoogleの情報はできません。その後、私の心に来る唯一の事は、マテリアライズド・ビューを使用している

+1

これは意味をなさない。ビューにはデータが含まれていないため、インデックスやキーはありません。 – skaffman

+0

マテリアライズド・ビューは主キーを持つことができますが、それを使用するかどうかわかりません。 –

+1

UNNIのコメントによれば、無効な主キー(または他の種類の)制約をビューに追加することは可能です。オプティマイザに情報を提供することができます。 http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96590/adg05itg.htmを参照し、「ビューの制約」を検索してください。 –

答えて

2

、その上に一意のインデックスを作成します。

drop materialized view tq84_mat_view; 
drop table tq84_table; 
create table tq84_table (
    a number, 
    b number 
); 

create materialized view tq84_mat_view 
refresh on commit as 
select 
    a, 
    sum(b) sum_b 
from 
    tq84_table 
group by 
    a; 

create unique index tq84_mat_view_uix on tq84_mat_view (sum_b); 

insert into tq84_table values (1, 1); 
insert into tq84_table values (2, 2); 
insert into tq84_table values (1, 4); 

commit; 

insert into tq84_table values (2, 3); 

commit; 
--> ORA-12008: error in materialized view refresh path 
--> ORA-00001: unique constraint (SPEZMDBA.TQ84_MAT_VIEW_UIX) violated 

これが役に立つかもしれませんが、それはマテリアライズド・ビューことを念頭に置いておく必要があり、 「通常の」ビューとは対照的に、表スペース内のスペースを占有します。もちろん、インデックスにもスペースが必要です。

2

残念なことに、SQL標準では、ビューではなく基本表に対してUNIQUEおよびPRIMARY KEY制約のみが許可されます。マテリアライズド・ビューでは一意の索引を使用できます

+5

それが可能ですが、無効状態でのみ。オプティマイザに情報を提供しますが、強制することはできません。 –

+0

正確にトニーが言ったこと。また、オブジェクト・リレーショナル・マッピングを行うツールの中には、使用不可能なプライマリ・キーと外部キーがビュー用に存在する必要があります。あるいは、恐ろしい実行計画を生成します。私たちは、Hibernateのバージョンの1つでその経験をしていましたが、どちらが覚えていないのでしょうか。 –

-4

これは、ビューに主キーを追加できる方法です。

CREATE OR REPLACE FORCE VIEW VU_NAME 
     (
      PRIMARY_KEY, NAME_ID, ADDRESS_ID 
     ) 
     AS 
     SELECT DISTINCT ROWNUM AS PRIMARY_KEY, 
      NAME.ID UNIT_ID, 
      ADDRESS_ID 
     from table1; 
+1

OPに "Primary Key"と表示されたら、 "Primary Key * Constraint *"を意味すると思われます。また、ROWNUMはクエリが実行されるたびに同じであることが保証されていないため、サロゲート主キーとしては適切ではありません。たとえテーブルが挿入や削除を受け取らないという前提を立てても –

+0

@Jeffrey Kemp ROWNUMは保証されていませんが、このコマンドを使用してROWNUMが常にプライマリ制約を作成できることに全面的に同意します。 'VU_NAMEビューの制約を追加するには制約のvemp_pkプライマリキー(PRIMARY_KEY)を無効にする'それでも私の質問には答えられないままでした**なぜ彼は自分の見解に主キーを持ちたいのですか? –

関連する問題