データをコピーせずにOracleテーブルのコピーを作成するにはどうすればよいですか?


回答:


420

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

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

制限事項

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

  • シーケンス
  • トリガー
  • インデックス
  • 一部の制約はコピーされない可能性があります
  • マテリアライズドビューログ

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



53
これはすばらしい、明確な答えです。これには制約が含まれていないことに注意してください。新しいテーブルには主キーさえありません。
JosephStyons 2008年

18
これはシーケンスもトリガーも複製しません。
branchgabriel 08年

16
また、新しいテーブルにはインデックスがありません-新しいテーブルで大きなクエリを実行しようとしないでください:-)
hamishmcn

8
また、パーティションも処理しません。しかし、ちょっと。
MK。

17
単なる補遺-これいくつかの制約含まれます-つまり、NOT NULL制約がコピーされます。
Jeffrey Kemp

84

私はあなたが多く受け入れた方法を使用しましたが、誰かが指摘したように、それは制約を複製しません(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;

別のスキーマからコピーしたい場合、このコマンドはどのように変更されますか?
kushalvm 2013

My_table_nameは既存のテーブルです。しかし、新しいテーブルの名前を作成するにはどうすればよいですか?
kushalvm 2013

私の回答のコマンドは新しいテーブルを作成しません。元のテーブルの再作成に使用するSQLを返します。必要に応じて変更し、実行します。したがって、新しいテーブルの名前は、指定することを選択したものです。
デイブコスタ2013

5
つまり、上記のsqlコマンドを変数に割り当てるようなものでなければなりません。ryt?例 new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). その間、ここでLONGが何をするか教えてください。
kushalvm 2013

15

SQL開発者を使用してテーブルを選択し、DDLタブをクリックします

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

sqldeveloperはoracleの無料アプリです。

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


Oracle SQL Developer v.18.3ではタブが呼び出されますSQL
Metafaniel

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

繰り返しを回避し、1 = 2の条件に基づいて何も挿入しないようにする


4
    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; 

3

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


2
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

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


1

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

create table abc_new as select * from abc; 

次に、テーブルを切り捨てますabc_new。これで十分でしょう。


11
もちろん、元のテーブルに大量のデータがある場合、これは非常に悪い考えです。;)
Alexios 2013年

1

次のようなクエリを記述するだけです。

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

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


1

WHERE 1 = 0または同様の誤った条件が機能しますが、私はそれらがどのように見えるか嫌いです。Oracle 12c + IMHOのマージナルクリーンコードは

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

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


1

または、以下のコマンドからテーブル作成のddlを取得し、作成を実行できます。

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPEであるTABLEPROCEDUREなど

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


の引数でGET_DDLは大文字と小文字が区別されることに注意してください。
Sridhar Sarnobat


0

pl / sql開発者を使用して、sqlワークスペースまたはオブジェクトエクスプローラーでtable_nameを右クリックし、[view]をクリックして[view sql]をクリックすると、すべての制約とともにテーブルを作成するSQLスクリプトが生成されます。 、インデックス、パーティションなど。

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


0

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

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

テーブルデータをコピー

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

0
  1. select x from xyzとしてテーブルxyz_newを作成します。

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

  1. xyz_newから削除します。

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

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


-5

上記のタスクは、2つの簡単なステップで完了することができます。

ステップ1:

CREATE table new_table_name AS(Select * from old_table_name);

query上記(内容も)テーブルの複製を作成します。

構造を取得するには、使用してテーブルの内容を削除します。

ステップ2:

DELETE * FROM new_table_name.

これで問題が解決することを願っています。そして、以前の投稿に感謝します。私に多くの洞察を与えました。


13
これはtruncateバージョンよりも効率が悪いです。すべてのデータにエクステントを割り当てるだけでなく、削除してもエクステントが解放されないので、テーブルが古いサイズに大きくならない限り、スペースを無駄にする可能性があります。そして、挿入と削除の両方で元に戻す/やり直しを生成しています。ジムの答えは非常に単純にそのすべてを回避します。
Alex Poole
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.