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


Answers

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




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 target_table 
As
Select * 
from source_table 
where 1=2;

Source_table ist die Tabelle, die du kopieren willst.




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




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.




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.




    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;