web-dev-qa-db-ja.com

データをコピーせずにOracleテーブルのコピーを作成する方法を教えてください。

私は文を知っています:

create table xyz_new as select * from xyz;

どちらが構造とデータをコピーしますが、単に構造が必要な場合はどうすればよいですか。

254
Andrew

行を選択しないwhere句を使用するだけです。

create table xyz_new as select * from xyz where 1=0;

制限事項

次のものは新しいテーブルにコピーされません。

  • シーケンス
  • トリガー
  • 索引
  • いくつかの制約はコピーされないかもしれません
  • マテリアライズド・ビュー・ログ

これもパーティションを処理しません


399
Jim Hudson

私はあなたが多くを受け入れた方法を使いました、しかし誰かが指摘したようにそれは制約を複製しません(NOT NULLを除いて、私は思います)。

完全な構造を複製したい場合は、もっと高度な方法があります。

SET LONG 5000
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME' ) FROM DUAL;

これにより、新しいテーブルを作成したいときに変更できる、完全なcreateステートメントのテキストが得られます。もちろん、テーブルの名前とすべての制約を変更する必要があります。

(EXP/IMPを使って古いバージョンでこれを行うこともできますが、今でははるかに簡単になりました。)

追加するように編集されています後にあるテーブルが別のスキーマにある場合:

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
83
Dave Costa

SQL開発者を使用してテーブルを選択し、DDLタブをクリックしてください

そのコードを使用して、SQLワークシートで実行すると、データのない新しいテーブルを作成できます。

sqldeveloperは、Oracleのアプリを無料で使用することができます。

テーブルにシーケンスやトリガがある場合は、ddlがそれらを生成することもあります。あなたはそれらをどのような順番で並べるか、そしていつトリガーをオンまたはオフにするかを知っている必要があります。

15
branchgabriel
create table xyz_new as select * from xyz where rownum = -1;

何度も繰り返すことを避け、1 = 2の条件に基づいて何も挿入しない

14
sunleo
    DECLARE
    l_ddl   VARCHAR2 (32767);
BEGIN
    l_ddl      := REPLACE (
                      REPLACE (
                          DBMS_LOB.SUBSTR (DBMS_METADATA.get_ddl ('TABLE', 'ACTIVITY_LOG', 'OLDSCHEMA'))
                        , q'["OLDSCHEMA"]'
                        , q'["NEWSCHEMA"]'
                      )
                    , q'["OLDTABLSPACE"]'
                    , q'["NEWTABLESPACE"]'
                  );

    EXECUTE IMMEDIATE l_ddl;
END; 
4
Brian Leach

あなたはこれを行うことができますCreate table New_table as select * from Old_table where 1=2 ;しかし注意してくださいold_tableのようにインデックスやPkなどを作成するテーブルはありません。

3
Mohsen Molaei
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

別のスキーマを使用して、新しい空のテーブルを作成します。クエリがデータを返さないようにするWHERE句を追加するだけです。

2
guesswho

WHERE 1 = 0または類似の偽の条件は機能しますが、私はそれらがどのように見えるかが嫌いです。 Oracle 12c + IMHOのマージンがよりきれいなコードは

CREATE TABLE bar AS SELECT * FROM foo FETCH FIRST 0 ROWS ONLY;

同じ制限が適用されます。列定義とそのNULL可能性のみが新しい表にコピーされます。

1
DKroot

次のようなクエリを書くだけです。

create table new_table as select * from old_table where 1=2;

new_tableは作成する新しいテーブルの名前、old_tableは構造をコピーする既存のテーブルの名前です。これは構造のみをコピーします。

1
user3284249

あなたもすることができます

create table abc_new as select * from abc; 

その後、テーブルabc_newを切り捨てます。これがあなたの要求を十分に満たすことを願っています。

0
Digo
Create table target_table 
As
Select * 
from source_table 
where 1=2;

Source_tableは構造体をコピーしたいテーブルです。

0
Prashant Mishra

他の方法であなたは以下にリストされたコマンドからテーブル作成のddlを得て、そして作成を実行することができます。

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 

TYPE is ('TABLE','PROCEDURE', etc...)

このコマンドを使用すると、データベースオブジェクトからddlの大部分を取得できます。

0
Diogo Maschio
  1. select xからselect *としてテーブルxyz_newを作成します。

-これにより、テーブルが作成され、すべてのデータがコピーされます。

  1. xyz_newから削除。

-これは同じテーブル構造になりますが、コピーされたすべてのデータは削除されます。

回答で指定された制限を克服する場合: データをコピーせずにOracleテーブルのコピーを作成するにはどうすればよいですか?

Pl/sql開発者を使用すると、 "view"をクリックし、 "view sql"をクリックするよりも、SQLワークスペースまたはオブジェクトエクスプローラのいずれかでtable_nameを右クリックすることができます。 、インデックス、パーティションなど.

次に、new_table_nameを使用してスクリプトを実行します。

0
Yariv Scheingut

テーブルデータなしでコピー

create table <target_table> as select * from <source_table> where 1=2;

テーブルデータをコピー

create table <target_table> as select * from <source_table>;
0
Alok