Odpowiedzi:
Wystarczy użyć klauzuli where, która nie wybierze żadnych wierszy:
create table xyz_new as select * from xyz where 1=0;
Następujące rzeczy nie zostaną skopiowane do nowej tabeli:
To również nie obsługuje partycji
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;
My_table_name
to istniejąca tabela. Ale jak mogę utworzyć nazwę mojego nowego stołu?
new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ).
Tymczasem proszę daj mi znać, co LONG tutaj robi.
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.
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;
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
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:
Po prostu napisz zapytanie takie jak:
create table new_table as select * from old_table where 1=2;
gdzie new_table
jest nazwa nowej tabeli, którą chcesz utworzyć, i old_table
nazwa istniejącej tabeli, której strukturę chcesz skopiować, spowoduje to skopiowanie tylko struktury.
WHERE 1 = 0
lub 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.
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
TYPE
jest TABLE
, PROCEDURE
itd.Za pomocą tego polecenia można uzyskać większość ddl z obiektów bazy danych.
GET_DDL
rozróżniana jest wielkość liter.
Create table target_table
As
Select *
from source_table
where 1=2;
Tabela_źródł jest tabelą, którą chcesz skopiować.
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
- utwórz tabelę xyz_new jako wybierz * z xyz;
- Spowoduje to utworzenie tabeli i skopiowanie wszystkich danych.
- 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?
Powyższe zadanie można wykonać w dwóch prostych krokach.
CREATE table new_table_name AS(Select * from old_table_name);
The query
Powyżej tworzy duplikat tabeli (z treści, jak również).
Aby uzyskać strukturę, usuń zawartość tabeli za pomocą.
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.
truncate
wersja. 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.