it-swarm.com.de

Wie kann ich eine Kopie einer Oracle-Tabelle erstellen, ohne die Daten zu kopieren?

Ich kenne die Aussage:

create table xyz_new as select * from xyz;

Welche kopiert die Struktur und die Daten, aber was ist, wenn ich nur die Struktur will?

260
Andrew

Verwenden Sie einfach eine where-Klausel, die keine Zeilen auswählt:

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

Einschränkungen

Die folgenden Dinge werden nicht in die neue Tabelle kopiert:

  • sequenzen
  • löst aus
  • indizes
  • einige Einschränkungen können möglicherweise nicht kopiert werden
  • materialisierte Ansichtsprotokolle

Dies behandelt auch keine Partitionen


403
Jim Hudson

Ich habe die Methode verwendet, die Sie sehr akzeptiert haben, aber wie jemand darauf hingewiesen hat, werden Einschränkungen nicht dupliziert (außer NOT NULL, glaube ich).

Eine fortgeschrittenere Methode, wenn Sie die gesamte Struktur duplizieren möchten, ist:

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

Auf diese Weise erhalten Sie den vollständigen Text der Anweisung create, den Sie bei Bedarf zum Erstellen der neuen Tabelle ändern können. Sie müssten natürlich die Namen der Tabelle und alle Einschränkungen ändern.

(Sie können dies auch in älteren Versionen mit EXP/IMP tun, aber es ist jetzt viel einfacher.)

Zum Hinzufügen bearbeitet Wenn sich die Tabelle, nach der Sie suchen, in einem anderen Schema befindet:

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

Wählen Sie mit SQL Developer die Tabelle aus und klicken Sie auf die Registerkarte DDL

Mit diesem Code können Sie eine neue Tabelle ohne Daten erstellen, wenn Sie sie in einem SQL-Arbeitsblatt ausführen

sqldeveloper ist eine kostenlose App von Oracle.

Wenn die Tabelle Sequenzen oder Trigger enthält, generiert die DDL diese manchmal auch für Sie. Sie müssen nur vorsichtig sein, in welcher Reihenfolge Sie sie eingeben, und wissen, wann die Trigger ein- oder ausgeschaltet werden müssen.

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

Vermeiden Sie es, immer wieder zu iterieren, und fügen Sie basierend auf der Bedingung 1 = 2 nichts ein

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

Du kannst das Create table New_table as select * from Old_table where 1=2 ;aber sei vorsichtig Die Tabelle, die du erstellst, hat keinen Index, Pk und so weiter wie die alte Tabelle

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

Erstellen Sie eine neue, leere Tabelle mit dem Schema einer anderen. Fügen Sie einfach eine WHERE-Klausel hinzu, die bewirkt, dass die Abfrage keine Daten zurückgibt:

2
guesswho

Auf andere Weise können Sie die DDL der Tabellenerstellung über den unten aufgeführten Befehl abrufen und die Erstellung ausführen.

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPE ist TABLE, PROCEDURE usw.

Mit diesem Befehl können Sie einen Großteil von ddl aus Datenbankobjekten abrufen.

1
Diogo Maschio

WHERE 1 = 0 oder ähnliche falsche Bedingungen funktionieren, aber ich mag nicht, wie sie aussehen. Unbedingt sauberer Code für Oracle 12c + ist IMHO

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

Dieselben Einschränkungen gelten: Nur Spaltendefinitionen und deren Nullwert werden in eine neue Tabelle kopiert.

1
DKroot

Schreiben Sie einfach eine Abfrage wie:

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

wo new_table ist der Name der neuen Tabelle, die Sie erstellen möchten, und old_table ist der Name der vorhandenen Tabelle, deren Struktur Sie kopieren möchten. Dadurch wird nur die Struktur kopiert.

1
user3284249

sie können auch eine

create table abc_new as select * from abc; 

dann kürzen Sie die Tabelle abc_new. Hoffe, dies wird Ihrer Anforderung genügen.

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

Source_table ist die Tabelle, deren Struktur kopiert werden soll.

0
Prashant Mishra
  1. erstellen Sie die Tabelle xyz_new als select * from xyz;

- Dadurch wird eine Tabelle erstellt und alle Daten kopiert.

  1. aus xyz_new löschen;

- Dies hat die gleiche Tabellenstruktur, aber alle kopierten Daten werden gelöscht.

Wenn Sie die durch answer angegebenen Einschränkungen überwinden möchten: Wie kann ich eine Kopie einer Oracle-Tabelle erstellen, ohne die Daten zu kopieren?

Mit pl/sql developer können Sie entweder im SQL-Arbeitsbereich oder im Objekt-Explorer mit der rechten Maustaste auf den Tabellennamen klicken. Klicken Sie dann auf "view" und dann auf "view sql", wodurch das SQL-Skript zum Erstellen der Tabelle mit allen Einschränkungen generiert wird , Indizes, Partitionen etc ..

Als Nächstes führen Sie das Skript mit dem Namen new_table_name aus

0
Yariv Scheingut

Kopie ohne Tabellendaten

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

Kopie mit Tabellendaten

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