Antworten:
Verwenden Sie einfach eine where-Klausel, die keine Zeilen auswählt:
create table xyz_new as select * from xyz where 1=0;
Die folgenden Dinge werden nicht in die neue Tabelle kopiert:
Dies behandelt auch keine Partitionen
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;
My_table_name
ist die vorhandene Tabelle. Aber wie bekomme ich den Namen meiner neuen Tabelle erstellt?
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.
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.
SQL
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;
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
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.
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.
WHERE 1 = 0
oder ä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.
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
TYPE
ist TABLE
, PROCEDURE
usw.Mit diesem Befehl können Sie einen Großteil von ddl von Datenbankobjekten abrufen.
GET_DDL
Groß- und Kleinschreibung unterschieden wird.
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table ist die Tabelle, deren Struktur Sie kopieren möchten.
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
- Erstelle die Tabelle xyz_new als select * from xyz;
- Dadurch wird eine Tabelle erstellt und alle Daten kopiert.
- aus xyz_new löschen;
- Dies hat dieselbe Tabellenstruktur, aber alle kopierten Daten werden gelöscht.
Wenn Sie die durch die Antwort angegebenen Einschränkungen überwinden möchten: Wie kann ich eine Kopie einer Oracle-Tabelle erstellen, ohne die Daten zu kopieren?
Die obige Aufgabe kann in zwei einfachen Schritten erledigt werden.
CREATE table new_table_name AS(Select * from old_table_name);
Das query
obige erstellt ein Duplikat einer Tabelle (auch mit Inhalt).
Um die Struktur zu erhalten, löschen Sie den Inhalt der Tabelle mit.
DELETE * FROM new_table_name.
Hoffe das löst dein Problem. Und danke an die früheren Beiträge. Hat mir viel Einblick gegeben.
truncate
Version. 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.