Bagaimana saya bisa membuat salinan tabel Oracle tanpa menyalin data?

Jawaban:

420

Cukup gunakan klausa where yang tidak akan memilih baris apa pun:

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

Keterbatasan

Hal-hal berikut tidak akan disalin ke tabel baru:

  • urutan
  • pemicu
  • indeks
  • beberapa kendala mungkin tidak dapat disalin
  • log tampilan terwujud

Ini juga tidak menangani partisi


Jim Hudson
sumber
53
Ini jawaban yang bagus dan bersih. Hanya ingin mengingatkan bahwa ini tidak akan menyertakan kendala .. tabel baru bahkan tidak akan memiliki kunci utama.
JosephStyons
18
ini tidak akan mereplikasi urutan atau pemicu.
branchgabriel
16
tabel juga tidak akan memiliki indeks - jangan kedapatan mencoba melakukan kueri besar di tabel baru :-)
hamishmcn
8
juga tidak menangani partisi. Tapi hey.
MK.
17
Hanya sebuah tambahan - ini akan mengandung beberapa batasan - yaitu batasan TIDAK NULL yang akan disalin.
Jeffrey Kemp
84

Saya menggunakan metode yang Anda terima banyak, tetapi sebagai seseorang menunjukkan itu tidak menduplikasi kendala (kecuali untuk NOT NULL, saya pikir).

Metode yang lebih maju jika Anda ingin menduplikasi struktur penuh adalah:

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

Ini akan memberi Anda teks pernyataan buat lengkap yang dapat Anda modifikasi sesuai keinginan untuk membuat tabel baru. Anda harus mengubah nama tabel dan semua kendala tentu saja.

(Anda juga bisa melakukan ini dalam versi yang lebih lama menggunakan EXP / IMP, tetapi sekarang jauh lebih mudah.)

Diedit untuk menambahkan Jika tabel yang Anda cari ada dalam skema yang berbeda:

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
Dave Costa
sumber
Bagaimana perintah ini akan dimodifikasi jika saya ingin menyalin dari skema lain.
kushalvm
My_table_nameadalah tabel yang ada. Tapi bagaimana cara membuat nama tabel baru saya dibuat?
kushalvm
Perintah dalam jawaban saya tidak membuat tabel baru; ia mengembalikan SQL yang akan Anda gunakan untuk membuat ulang tabel asli. Anda memodifikasinya seperti yang diinginkan kemudian jalankan. Jadi nama tabel baru adalah apa pun yang Anda pilih untuk ditentukan.
Dave Costa
5
SO itu harus seperti menugaskan perintah sql di atas ke variabel. ryt? mis. new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). Sementara itu tolong beri tahu saya apa yang LONG lakukan di sini.
kushalvm
15

Menggunakan pengembang sql pilih tabel dan klik pada tab DDL

Anda bisa menggunakan kode itu untuk membuat tabel baru tanpa data saat Anda menjalankannya di lembar kerja sql

sqldeveloper adalah aplikasi gratis untuk digunakan dari oracle.

Jika tabel memiliki urutan atau pemicu, ddl terkadang akan menghasilkannya untuk Anda juga. Anda hanya harus berhati-hati dalam urutan apa Anda membuatnya dan tahu kapan menyalakan atau mematikan pemicu.

branchgabriel
sumber
Dalam Oracle SQL Developer v.18.3 tab ini disebutSQL
Metafaniel
14
create table xyz_new as select * from xyz where rownum = -1;

Untuk menghindari berulang-ulang dan masukkan apa pun berdasarkan kondisi di mana 1 = 2

sunleo
sumber
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
sumber
3

Anda dapat melakukan ini Create table New_table as select * from Old_table where 1=2 ; tetapi hati - hati . Tabel yang Anda buat dosis tidak memiliki Indeks, Pk dan sebagainya seperti old_table

Mohsen Molaei
sumber
2
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

Buat tabel baru yang kosong menggunakan skema yang lain. Cukup tambahkan klausa WHERE yang menyebabkan kueri tidak mengembalikan data:

tebak siapa
sumber
1

Anda juga bisa melakukan

create table abc_new as select * from abc; 

kemudian potong meja abc_new. Semoga ini akan mencukupi kebutuhan Anda.

Digo
sumber
11
Tentu saja, jika Anda memiliki BANYAK data di tabel asli, ini bisa menjadi ide yang sangat, sangat buruk. ;)
Alexios
1

Cukup tulis permintaan seperti:

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

di mana new_tablenama tabel baru yang ingin Anda buat dan old_tableadalah nama tabel yang ada yang strukturnya ingin Anda salin, ini hanya akan menyalin struktur.

pengguna3284249
sumber
1

WHERE 1 = 0atau kondisi palsu yang serupa berhasil, tetapi saya tidak suka tampilannya. Kode yang sedikit lebih bersih untuk Oracle 12c + IMHO adalah

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

Batasan yang sama berlaku: hanya definisi kolom dan nullability yang disalin ke tabel baru.

DKroot
sumber
1

Dengan cara lain Anda bisa mendapatkan ddl pembuatan tabel dari perintah yang tercantum di bawah ini, dan jalankan pembuatannya.

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

Dengan perintah ini, Anda bisa mendapatkan mayoritas ddl dari objek basis data.

Diogo Maschio
sumber
Perhatikan bahwa argumen untuk GET_DDLpeka terhadap huruf besar-kecil.
Sridhar Sarnobat
0
Create table target_table 
As
Select * 
from source_table 
where 1=2;

Source_table adalah tabel yang ingin Anda salin strukturnya.

Prashant Mishra
sumber
0

Menggunakan pengembang pl / sql Anda dapat mengklik kanan pada table_name baik di ruang kerja sql atau di objek explorer, daripada klik pada "view" dan kemudian klik "view sql" yang menghasilkan skrip sql untuk membuat tabel bersama dengan semua kendala , indeks, partisi dll.

Selanjutnya Anda menjalankan skrip menggunakan new_table_name

Yariv Scheingut
sumber
0

salin tanpa data tabel

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

salin dengan data tabel

create table <target_table> as select * from <source_table>;
Alok
sumber
0
  1. buat tabel xyz_new sebagai pilih * dari xyz;

- Ini akan membuat tabel dan menyalin semua data.

  1. hapus dari xyz_new;

- Ini akan memiliki struktur tabel yang sama tetapi semua data yang disalin akan dihapus.

Jika Anda ingin mengatasi keterbatasan yang ditentukan oleh jawaban: Bagaimana saya bisa membuat salinan tabel Oracle tanpa menyalin data?

Jeevan Reddy Gujjula
sumber
-5

Tugas di atas dapat diselesaikan dalam dua langkah sederhana.

LANGKAH 1:

CREATE table new_table_name AS(Select * from old_table_name);

Itu query atas membuat duplikat tabel (dengan konten juga).

Untuk mendapatkan struktur, hapus isi tabel menggunakan.

LANGKAH 2:

DELETE * FROM new_table_name.

Semoga ini bisa menyelesaikan masalah Anda. Dan terima kasih untuk posting sebelumnya. Memberiku banyak wawasan.

Donkha
sumber
13
Ini bahkan kurang efisien daripada truncateversi. Selain mengalokasikan luasan untuk semua data, Anda tidak membebaskannya dengan menghapus, jadi Anda berpotensi menyia-nyiakan ruang kecuali tabel tumbuh ke ukuran lama. Dan Anda menghasilkan undo / redo pada kedua sisipan dan hapus. Jawaban Jim dengan sangat sederhana menghindari semua itu.
Alex Poole