web-dev-qa-db-ja.com

11gのselect文から新しく作成された表の列にデフォルト値を設定する方法

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ステートメントを使用してこれを設定する方法を教えてください。

21
gitee.com

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;

つまり、ソーステーブル/選択から制約を継承しません。データ型(長さ/精度/スケール)のみが選択によって決定されます。

31
Gary Myers

その理由は、CTAS(選択としてテーブルを作成)がメタデータをソースからターゲットテーブルにコピーしないためです。

  • 主キーなし
  • 外部キーなし
  • 助成金なし
  • インデックスなし
  • ...

あなたが望むものを達成するために、私は

  • dbms_metadata.get_ddlを使用して完全なテーブル構造を取得し、テーブル名を新しい名前に置き換え、このステートメントを実行し、その後INSERTを実行してデータをコピーします
  • または、CTASを使用し続け、user_constraintsからソーステーブルの非null制約を抽出し、その後それらをターゲットテーブルに追加します。
9
Frank Schmitt

alter table abc modify (salary default 0);が必要です

6
Colin 't Hart

新しいテーブルは「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;
1
user3182853