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


Answers

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 nicht kopiert werden
  • materialisierte Ansichtsprotokolle

Dies funktioniert auch nicht mit Partitionen

Question

Ich kenne die Aussage:

create table xyz_new as select * from xyz;

Was kopiert die Struktur und die Daten, aber was ist, wenn ich nur die Struktur möchte?




Sie können auch ein tun

create table abc_new as select * from abc; 

dann trunkiere die Tabelle abc_new . Hoffe, das wird Ihre Anforderung genügen.




Die obige Aufgabe kann in zwei einfachen Schritten erledigt werden.

SCHRITT 1:

CREATE table new_table_name AS(Select * from old_table_name);

Die obige query erzeugt 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 Posts. Gab mir eine Menge Einblick.




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, hat keinen Index, Pk und so weiter wie die old_table




    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; 



Auf andere Weise können Sie ddl der Tabellenerstellung aus dem 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 is ('TABLE','PROCEDURE', etc...)

Mit diesem Befehl können Sie die Mehrheit der ddl von Datenbankobjekten erhalten.




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

Source_table ist die Tabelle, die du kopieren willst.




Mit pl / sql developer können Sie entweder im sql workspace oder im object explorer mit der rechten Maustaste auf table_name klicken, dann auf "view" klicken und dann auf "view sql" klicken, wodurch das sql Skript erzeugt wird, um die Tabelle zusammen mit allen Constraints zu erstellen , Indizes, Partitionen usw.

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




Ich habe die Methode verwendet, die Sie sehr akzeptiert haben, aber da jemand darauf hingewiesen hat, dass es keine Zwänge gibt (außer NOT NULL, denke ich).

Eine erweiterte 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 der Erstellungsanweisung, den Sie ändern können, wenn Sie die neue Tabelle erstellen möchten. Sie müssten natürlich die Namen der Tabelle und aller Nebenbedingungen ändern.

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

Bearbeitet zum Hinzufügen 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;



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

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

Es gelten die gleichen Einschränkungen: Nur Spaltendefinitionen und ihre NULL-Zulässigkeit werden in eine neue Tabelle kopiert.




Kopieren ohne Tabellendaten

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

Kopieren mit Tabellendaten

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



Wählen Sie die Tabelle mit sql developer aus und klicken Sie auf die Registerkarte DDL

Sie können diesen Code verwenden, um eine neue Tabelle ohne Daten zu erstellen, wenn Sie sie in einem SQL-Arbeitsblatt ausführen

sqldeveloper ist eine kostenlose App von Oracle.

Wenn die Tabelle Sequenzen oder Trigger hat, erzeugt das ddl manchmal auch diese für Sie. Sie müssen nur aufpassen, in welcher Reihenfolge Sie sie anlegen und wissen, wann Sie die Trigger ein- oder ausschalten müssen.




SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

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




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

Um zu vermeiden, wiederhole es immer wieder und füge nichts basierend auf der Bedingung ein, bei der 1 = 2 ist




Schreiben Sie einfach eine Abfrage wie:

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

Dabei ist new_table 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. old_table wird nur die Struktur kopiert.