Jak mogę utworzyć kopię tabeli Oracle bez kopiowania danych?

Odpowiedzi:

420

Wystarczy użyć klauzuli where, która nie wybierze żadnych wierszy:

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

Ograniczenia

Następujące rzeczy nie zostaną skopiowane do nowej tabeli:

  • sekwencje
  • wyzwalacze
  • indeksy
  • niektóre ograniczenia mogą nie zostać skopiowane
  • zmaterializowane dzienniki widoków

To również nie obsługuje partycji


Jim Hudson
źródło
53
To świetna, czysta odpowiedź. Chcę tylko przypomnieć, że nie będzie to obejmować żadnych ograniczeń. Nowa tabela nie będzie miała nawet klucza podstawowego.
JosephStyons
18
nie będzie to również replikować sekwencji ani wyzwalaczy.
branchgabriel
16
nowa tabela też nie będzie miała żadnych indeksów - nie
daj
8
również nie obsługuje partycji. Ale hej.
MK.
17
Tylko dodatek - będzie zawierał pewne ograniczenia - tzn. Wszelkie ograniczenia NOT NULL zostaną skopiowane.
Jeffrey Kemp
84

Użyłem metody, którą dużo zaakceptowałeś, ale jak ktoś zauważył, nie powiela ona ograniczeń (chyba, że ​​NOT NOT NULL).

Bardziej zaawansowaną metodą, jeśli chcesz powielić pełną strukturę, jest:

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

To da ci pełny tekst instrukcji tworzenia, którą możesz modyfikować, kiedy chcesz utworzyć nową tabelę. Będziesz musiał zmienić nazwy tabeli i wszystkie ograniczenia oczywiście.

(Możesz to również zrobić w starszych wersjach przy użyciu EXP / IMP, ale teraz jest to o wiele łatwiejsze.)

Edytowano, aby dodać Jeśli poszukiwana tabela jest w innym schemacie:

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
Dave Costa
źródło
Jak to polecenie zostanie zmodyfikowane, jeśli chcę skopiować z innego schematu.
kushalvm
My_table_nameto istniejąca tabela. Ale jak mogę utworzyć nazwę mojego nowego stołu?
kushalvm
Polecenie w mojej odpowiedzi nie tworzy nowej tabeli; zwraca SQL, którego użyłbyś do odtworzenia oryginalnej tabeli. Zmodyfikuj go zgodnie z potrzebami, a następnie uruchom. Tak więc nazwa nowej tabeli jest tym, co wybierzesz.
Dave Costa
5
SO musi więc przypominać przypisanie powyższej komendy sql do zmiennej. ryt? np. new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). Tymczasem proszę daj mi znać, co LONG tutaj robi.
kushalvm
15

Za pomocą programisty sql wybierz tabelę i kliknij kartę DDL

Możesz użyć tego kodu, aby utworzyć nową tabelę bez danych po uruchomieniu go w arkuszu SQL

sqldeveloper to darmowa aplikacja z Oracle.

Jeśli tabela ma sekwencje lub wyzwalacze, ddl czasami generuje je również dla Ciebie. Musisz tylko uważać, w jakiej kolejności je robisz i wiedzieć, kiedy włączyć lub wyłączyć wyzwalacze.

branchgabriel
źródło
W Oracle SQL Developer v.18.3 zakładka nazywa sięSQL
Metafaniel
14
create table xyz_new as select * from xyz where rownum = -1;

Aby uniknąć iteracji raz po raz i nic nie wstawiać w oparciu o warunek, w którym 1 = 2

sunleo
źródło
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
źródło
3

Możesz to zrobić, Create table New_table as select * from Old_table where 1=2 ; ale bądź ostrożny . Tabela, którą tworzysz, nie ma żadnego indeksu, Pk i tak dalej, jak old_table

Mohsen Molaei
źródło
2
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

Utwórz nową pustą tabelę, korzystając ze schematu innej. Wystarczy dodać klauzulę WHERE, która powoduje, że zapytanie nie zwraca danych:

Zgadnij kto
źródło
1

możesz także zrobić

create table abc_new as select * from abc; 

następnie obetnij stół abc_new. Mam nadzieję, że to wystarczy.

Digo
źródło
11
Oczywiście, jeśli masz dużo danych w oryginalnej tabeli, może to być naprawdę zły pomysł. ;)
Alexios
1

Po prostu napisz zapytanie takie jak:

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

gdzie new_tablejest nazwa nowej tabeli, którą chcesz utworzyć, i old_tablenazwa istniejącej tabeli, której strukturę chcesz skopiować, spowoduje to skopiowanie tylko struktury.

użytkownik3284249
źródło
1

WHERE 1 = 0lub podobne fałszywe warunki działają, ale nie podoba mi się ich wygląd. Marginalnie czystszy kod dla Oracle 12c + IMHO to

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

Obowiązują te same ograniczenia: tylko definicje kolumn i ich dopuszczalność zerowania są kopiowane do nowej tabeli.

DKroot
źródło
1

W inny sposób można uzyskać ddl tworzenia tabeli z polecenia wymienionego poniżej i wykonać tworzenie.

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPEjest TABLE, PROCEDUREitd.

Za pomocą tego polecenia można uzyskać większość ddl z obiektów bazy danych.

Diogo Maschio
źródło
Zauważ, że w argumentach GET_DDLrozróżniana jest wielkość liter.
Sridhar Sarnobat
0
Create table target_table 
As
Select * 
from source_table 
where 1=2;

Tabela_źródł jest tabelą, którą chcesz skopiować.

Prashant Mishra
źródło
0

Za pomocą programisty pl / sql możesz kliknąć prawym przyciskiem myszy nazwę_tabeli w obszarze roboczym sql lub w eksploratorze obiektów, a następnie kliknąć „widok”, a następnie „widok sql”, który generuje skrypt sql, aby utworzyć tabelę wraz ze wszystkimi ograniczeniami , indeksy, partycje itp.

Następnie uruchom skrypt, używając nowej_tabeli_nazwy

Yariv Scheingut
źródło
0

kopiuj bez danych tabeli

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

kopiuj z danymi tabeli

create table <target_table> as select * from <source_table>;
Alok
źródło
0
  1. utwórz tabelę xyz_new jako wybierz * z xyz;

- Spowoduje to utworzenie tabeli i skopiowanie wszystkich danych.

  1. usuń z xyz_new;

- Będzie miał tę samą strukturę tabeli, ale wszystkie skopiowane dane zostaną usunięte.

Jeśli chcesz przezwyciężyć ograniczenia określone w odpowiedzi: Jak mogę utworzyć kopię tabeli Oracle bez kopiowania danych?

Jeevan Reddy Gujjula
źródło
-5

Powyższe zadanie można wykonać w dwóch prostych krokach.

KROK 1:

CREATE table new_table_name AS(Select * from old_table_name);

The queryPowyżej tworzy duplikat tabeli (z treści, jak również).

Aby uzyskać strukturę, usuń zawartość tabeli za pomocą.

KROK 2:

DELETE * FROM new_table_name.

Mam nadzieję, że to rozwiąże twój problem. I dzięki wcześniejszym postom. Dał mi wiele wglądu.

Donkha
źródło
13
To nawet mniej wydajne niż truncatewersja. Oprócz przydziału zakresów dla wszystkich danych, nie zwalniasz ich przez usunięcie, więc potencjalnie marnujesz miejsce, chyba że tabela powiększy się do starego rozmiaru. I generujesz cofanie / ponawianie zarówno dla wstawiania, jak i usuwania. Odpowiedź Jima po prostu unika tego wszystkiego.
Alex Poole,