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



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;

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.


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


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; 

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


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:


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.


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.


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.


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.


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ć.


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


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


-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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.