Jawaban:
Cukup gunakan klausa where yang tidak akan memilih baris apa pun:
create table xyz_new as select * from xyz where 1=0;
Hal-hal berikut tidak akan disalin ke tabel baru:
Ini juga tidak menangani partisi
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;
My_table_name
adalah tabel yang ada. Tapi bagaimana cara membuat nama tabel baru saya dibuat?
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.
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.
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;
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
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:
Cukup tulis permintaan seperti:
create table new_table as select * from old_table where 1=2;
di mana new_table
nama tabel baru yang ingin Anda buat dan old_table
adalah nama tabel yang ada yang strukturnya ingin Anda salin, ini hanya akan menyalin struktur.
WHERE 1 = 0
atau 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.
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
TYPE
adalah TABLE
, PROCEDURE
dll.Dengan perintah ini, Anda bisa mendapatkan mayoritas ddl dari objek basis data.
GET_DDL
peka terhadap huruf besar-kecil.
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table adalah tabel yang ingin Anda salin strukturnya.
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
- buat tabel xyz_new sebagai pilih * dari xyz;
- Ini akan membuat tabel dan menyalin semua data.
- 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?
Tugas di atas dapat diselesaikan dalam dua langkah sederhana.
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.
DELETE * FROM new_table_name.
Semoga ini bisa menyelesaikan masalah Anda. Dan terima kasih untuk posting sebelumnya. Memberiku banyak wawasan.
truncate
versi. 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.