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


Antworten:


420

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



53
Dies ist eine großartige, saubere Antwort. Erinnern möchte nur , dass dies nicht alle Zwänge sind .. die neue Tabelle wird noch nicht einmal einen Primärschlüssel.
JosephStyons

18
Dadurch werden auch keine Sequenzen oder Trigger repliziert.
Branchgabriel

16
Die neue Tabelle wird auch keine Indizes haben - lassen Sie sich nicht
überraschen

8
behandelt auch keine Partitionen. Aber hey.
MK.

17
Nur ein Nachtrag - es wird enthalten einige Einschränkungen - dh alle NOT NULL Einschränkungen kopiert werden.
Jeffrey Kemp

84

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

Eine fortgeschrittenere Methode, wenn Sie die vollständige Struktur duplizieren möchten, ist:

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

Dadurch erhalten Sie den vollständigen Text für die Erstellungsanweisung, den Sie nach Belieben 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 jetzt ist es viel einfacher.)

Zum Hinzufügen bearbeitet Wenn sich die gesuchte Tabelle in einem anderen Schema befindet:

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

Wie wird dieser Befehl geändert, wenn ich aus einem anderen Schema kopieren möchte?
Kushalvm

My_table_nameist die vorhandene Tabelle. Aber wie bekomme ich den Namen meiner neuen Tabelle erstellt?
Kushalvm

Der Befehl in meiner Antwort erstellt keine neue Tabelle. Es gibt die SQL zurück, mit der Sie die ursprüngliche Tabelle neu erstellen würden. Sie ändern es wie gewünscht und führen es dann aus. Der Name der neuen Tabelle ist also das, was Sie angeben möchten.
Dave Costa

5
Es muss also so sein, als würde man den obigen SQL-Befehl einer Variablen zuweisen. ryt? z.B . new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). In der Zwischenzeit lassen Sie mich bitte wissen, was LONG hier macht.
Kushalvm

15

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 vornehmen, und wissen, wann Sie die Auslöser ein- oder ausschalten müssen.


In Oracle SQL Developer v.18.3 heißt die RegisterkarteSQL
Metafaniel

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

Um zu vermeiden, immer wieder zu iterieren und nichts einzufügen, basierend auf der Bedingung, dass 1 = 2 ist


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

Sie können dies tun, Create table New_table as select * from Old_table where 1=2 ; aber seien Sie vorsichtig. Die Tabelle, die Sie erstellen, enthält keinen Index, Pk usw. wie die old_table


2
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:


1

Sie können auch eine

create table abc_new as select * from abc; 

Schneiden Sie dann die Tabelle ab abc_new. Hoffe, dies wird Ihre Anforderung ausreichen.


11
Wenn Sie eine Menge Daten in der Originaltabelle haben, könnte dies natürlich eine wirklich, wirklich schlechte Idee sein. ;)
Alexios

1

Schreiben Sie einfach eine Abfrage wie:

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

Wo new_tableist der Name der neuen Tabelle, die Sie erstellen möchten, und old_tableist der Name der vorhandenen Tabelle, deren Struktur Sie kopieren möchten. Dadurch wird nur die Struktur kopiert.


1

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

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

Es gelten dieselben Einschränkungen: Nur Spaltendefinitionen und ihre Nullfähigkeit werden in eine neue Tabelle kopiert.


1

Auf andere Weise können Sie 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 
  • TYPEist TABLE, PROCEDUREusw.

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


Beachten Sie, dass bei den Argumenten zwischen GET_DDLGroß- und Kleinschreibung unterschieden wird.
Sridhar Sarnobat

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

Source_table ist die Tabelle, deren Struktur Sie kopieren möchten.


0

Mit pl / sql developer können Sie entweder im SQL-Arbeitsbereich oder im Objekt-Explorer mit der rechten Maustaste auf den Tabellennamen klicken, dann auf "Ansicht" und dann auf "View SQL" klicken, wodurch das SQL-Skript generiert wird, um die Tabelle zusammen mit allen Einschränkungen zu erstellen , Indizes, Partitionen usw ..

Als nächstes führen Sie das Skript mit dem neuen Tabellennamen aus


0

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


-5

Die obige Aufgabe kann in zwei einfachen Schritten erledigt werden.

SCHRITT 1:

CREATE table new_table_name AS(Select * from old_table_name);

Das queryobige erstellt ein Duplikat einer Tabelle (auch mit Inhalt).

Um die Struktur zu erhalten, löschen Sie den Inhalt der Tabelle mit.

SCHRITT 2:

DELETE * FROM new_table_name.

Hoffe das löst dein Problem. Und danke an die früheren Beiträge. Hat mir viel Einblick gegeben.


13
Dies ist noch weniger effizient als die truncateVersion. Sie weisen nicht nur Speicherbereiche für alle Daten zu, sondern geben sie auch nicht durch Löschen frei, sodass Sie möglicherweise Speicherplatz verschwenden, es sei denn, die Tabelle wächst auf die alte Größe. Und Sie generieren Rückgängig / Wiederherstellen sowohl beim Einfügen als auch beim Löschen. Jims Antwort vermeidet das alles ganz einfach.
Alex Poole
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.