私は文を知っています:
create table xyz_new as select * from xyz;
どちらが構造とデータをコピーしますが、単に構造が必要な場合はどうすればよいですか。
行を選択しないwhere句を使用するだけです。
create table xyz_new as select * from xyz where 1=0;
次のものは新しいテーブルにコピーされません。
これもパーティションを処理しません
私はあなたが多くを受け入れた方法を使いました、しかし誰かが指摘したようにそれは制約を複製しません(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;
SQL開発者を使用してテーブルを選択し、DDLタブをクリックしてください
そのコードを使用して、SQLワークシートで実行すると、データのない新しいテーブルを作成できます。
sqldeveloperは、Oracleのアプリを無料で使用することができます。
テーブルにシーケンスやトリガがある場合は、ddlがそれらを生成することもあります。あなたはそれらをどのような順番で並べるか、そしていつトリガーをオンまたはオフにするかを知っている必要があります。
create table xyz_new as select * from xyz where rownum = -1;
何度も繰り返すことを避け、1 = 2の条件に基づいて何も挿入しない
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;
あなたはこれを行うことができますCreate table New_table as select * from Old_table where 1=2 ;
しかし注意してくださいold_tableのようにインデックスやPkなどを作成するテーブルはありません。
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;
別のスキーマを使用して、新しい空のテーブルを作成します。クエリがデータを返さないようにするWHERE句を追加するだけです。
WHERE 1 = 0
または類似の偽の条件は機能しますが、私はそれらがどのように見えるかが嫌いです。 Oracle 12c + IMHOのマージンがよりきれいなコードは
CREATE TABLE bar AS SELECT * FROM foo FETCH FIRST 0 ROWS ONLY;
同じ制限が適用されます。列定義とそのNULL可能性のみが新しい表にコピーされます。
次のようなクエリを書くだけです。
create table new_table as select * from old_table where 1=2;
new_table
は作成する新しいテーブルの名前、old_table
は構造をコピーする既存のテーブルの名前です。これは構造のみをコピーします。
あなたもすることができます
create table abc_new as select * from abc;
その後、テーブルabc_new
を切り捨てます。これがあなたの要求を十分に満たすことを願っています。
Create table target_table
As
Select *
from source_table
where 1=2;
Source_tableは構造体をコピーしたいテーブルです。
他の方法であなたは以下にリストされたコマンドからテーブル作成のddlを得て、そして作成を実行することができます。
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
TYPE is ('TABLE','PROCEDURE', etc...)
このコマンドを使用すると、データベースオブジェクトからddlの大部分を取得できます。
- select xからselect *としてテーブルxyz_newを作成します。
-これにより、テーブルが作成され、すべてのデータがコピーされます。
- xyz_newから削除。
-これは同じテーブル構造になりますが、コピーされたすべてのデータは削除されます。
回答で指定された制限を克服する場合: データをコピーせずにOracleテーブルのコピーを作成するにはどうすればよいですか?
Pl/sql開発者を使用すると、 "view"をクリックし、 "view sql"をクリックするよりも、SQLワークスペースまたはオブジェクトエクスプローラのいずれかでtable_nameを右クリックすることができます。 、インデックス、パーティションなど.
次に、new_table_nameを使用してスクリプトを実行します。
create table <target_table> as select * from <source_table> where 1=2;
create table <target_table> as select * from <source_table>;