Hoe kan ik een kopie van een Oracle-tabel maken zonder de gegevens te kopiëren?

Ik ken de uitspraak:

create table xyz_new as select * from xyz;

Wat kopieert de structuur en de gegevens, maar wat als ik alleen de structuur wil?


Antwoord 1, autoriteit 100%

Gebruik gewoon een waar-clausule die geen rijen selecteert:

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

Beperkingen

De volgende dingen worden niet gekopieerd naar de nieuwe tabel:

  • reeksen
  • triggers
  • indexen
  • sommige beperkingen mogen niet worden gekopieerd
  • gematerialiseerde weergavelogboeken

Dit behandelt ook geen partities



Antwoord 2, autoriteit 19%

Ik heb de methode die je veel hebt geaccepteerd, veel gebruikt, maar zoals iemand opmerkte, zijn er geen dubbele beperkingen (behalve voor NOT NULL, denk ik).

Een meer geavanceerde methode als u de volledige structuur wilt dupliceren is:

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

Dit geeft u de volledige tekst voor het maken van een instructie die u naar wens kunt wijzigen voor het maken van de nieuwe tabel. Je zou natuurlijk de namen van de tabel en alle beperkingen moeten veranderen.

(Je zou dit in oudere versies ook kunnen doen met EXP/IMP, maar het is nu veel gemakkelijker.)

Bewerkt om toe te voegen
Als de tabel die u zoekt zich in een ander schema bevindt:

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

Antwoord 3, autoriteit 4%

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

Om te voorkomen dat u keer op keer herhaalt en niets invoegt op basis van de voorwaarde waarbij 1=2


Antwoord 4, autoriteit 4%

Gebruik sql developer om de tabel te selecteren en op het DDL-tabblad te klikken

U kunt die code gebruiken om een ​​nieuwe tabel zonder gegevens te maken wanneer u deze uitvoert in een sql-werkblad

sqldeveloper is een gratis te gebruiken app van Oracle.

Als de tabel reeksen of triggers heeft, zal de ddl die soms ook voor u genereren. Je moet alleen voorzichtig zijn in de volgorde waarin je ze maakt en weten wanneer je de triggers moet in- of uitschakelen.


Antwoord 5

   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; 

Antwoord 6

U kunt dit doen
Create table New_table as select * from Old_table where 1=2 ;
maar wees voorzichtig
De tabel die u maakt heeft geen Index, PK enzovoort, zoals de old_table.


Antwoord 7

Stuur gewoon een zoekopdracht als:

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

waar new_tablede naam is van de nieuwe tabel die u wilt maken en old_tablede naam is van de bestaande tabel waarvan u de structuur wilt kopiëren, dit zal kopiëren alleen structuur.


Antwoord 8

SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

Maak een nieuwe, lege tabel met het schema van een ander. Voeg gewoon een WHERE-clausule toe die ervoor zorgt dat de query geen gegevens retourneert:


9

WHERE 1 = 0of soortgelijke valse omstandigheden werken, maar ik hou niet van hoe ze eruit zien. Marginally Cleaner-code voor Oracle 12C + IMHO is


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

Dezelfde beperkingen zijn van toepassing: alleen kolomdefinities en hun bijzonderheid worden gekopieerd naar een nieuwe tabel.


10

  1. Maak tabel xyz_new als selecteer * van XYZ;

– Hiermee wordt tabel en kopieert alle gegevens.

  1. verwijderen van xyz_new;

– Dit heeft dezelfde tabelstructuur, maar alle gegevens die worden gekopieerd, worden verwijderd.

Als u de beperkingen wilt overwinnen die zijn opgegeven door antwoord:
Hoe kan ik een kopie van een Oracle-tabel maken zonder de gegevens te kopiëren?

Other episodes