Oracle 11gで、いずれかの列のデフォルト値を使用してテーブルを作成します。構文は次のとおりです。
create table xyz(emp number,ename varchar2(100),salary number default 0);
これは正常に作成されました。何らかの理由で、同じ古いテーブル構造とデータで別のテーブルを作成する必要があります。そこで、abc
という名前の新しいテーブルを作成しました
create table abc as select * from xyz.
ここで、「abc」は古いテーブルxyz
と同じ構造とデータで正常に作成されました。しかし、古いテーブル「xyz」の列「salary」のデフォルト値は「0」に設定されていました。ただし、新しく作成されたテーブル「abc」では、デフォルト値は設定されていません。
これはすべてOracle 11gにあります。デフォルト値が設定されなかった理由と、selectステートメントを使用してこれを設定する方法を教えてください。
CREATE TABLE AS SELECTで制約とデフォルトを指定できますが、構文は次のとおりです。
create table t1 (id number default 1 not null);
insert into t1 (id) values (2);
create table t2 (id default 1 not null)
as select * from t1;
つまり、ソーステーブル/選択から制約を継承しません。データ型(長さ/精度/スケール)のみが選択によって決定されます。
その理由は、CTAS(選択としてテーブルを作成)がメタデータをソースからターゲットテーブルにコピーしないためです。
あなたが望むものを達成するために、私は
alter table abc modify (salary default 0);
が必要です
新しいテーブルは「not null」制約のみを継承し、他の制約は継承しません。したがって、「create table as」コマンドでテーブルを作成した後、テーブルを変更するか、次の手順に従って必要なすべての制約を定義できます。
create table t1 (id number default 1 not null);
insert into t1 (id) values (2);
create table t2 as select * from t1;
これにより、null制約ではないテーブルt2が作成されます。ただし、「not null」以外の制約については、次の構文を使用する必要があります
create table t1 (id number default 1 unique);
insert into t1 (id) values (2);
create table t2 (id default 1 unique)
as select * from t1;