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

273

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?

Andrew
quelle
1
Siehe auch
AlikElzin-kilaka

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


Jim Hudson
quelle
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;
Dave Costa
quelle
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.

branchgabriel
quelle
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

Sunleo
quelle
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; 
Brian Leach
quelle
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

Mohsen Molaei
quelle
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:

Rate wer
quelle
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.

Digo
quelle
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.

user3284249
quelle
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.

DKroot
quelle
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.

Diogo Maschio
quelle
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.

Prashant Mishra
quelle
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

Yariv Scheingut
quelle
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>;
Alok
quelle
-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.

Donkha
quelle
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