Yanıtlar:
Herhangi bir satır seçmeyen bir where yan tümcesi kullanın:
create table xyz_new as select * from xyz where 1=0;
Aşağıdaki şeyler yeni tabloya kopyalanmaz:
Bu ayrıca bölümleri işlemez
Ben çok kabul ettiğin yöntemi kullandım, ama birisi işaret gibi kısıtlamaları yinelenmez (NOT NULL hariç, sanırım).
Tüm yapıyı çoğaltmak istiyorsanız daha gelişmiş bir yöntem:
SET LONG 5000
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME' ) FROM DUAL;
Bu, yeni tabloyu oluşturmak için istediğiniz gibi değiştirebileceğiniz tam create deyimi metnini verecektir. Tablonun adlarını ve elbette tüm kısıtlamaları değiştirmeniz gerekir.
(Bunu eski sürümlerde EXP / IMP kullanarak da yapabilirsiniz, ancak şimdi çok daha kolay.)
Eklemek için düzenlendi. Bulunduğunuz tablo farklı bir şemadaysa:
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
My_table_name
mevcut tablodur. Ancak yeni masamın adını nasıl oluşturabilirim?
new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ).
Bu arada lütfen LONG'nin burada ne yaptığını bana bildirin.
Sql geliştiricisini kullanarak tabloyu seçin ve DDL sekmesine tıklayın
Bir sql çalışma sayfasında çalıştırdığınızda veri içermeyen yeni bir tablo oluşturmak için bu kodu kullanabilirsiniz
sqldeveloper oracle app kullanmak için ücretsizdir.
Tablonun dizileri veya tetikleyicileri varsa, ddl bazen bunları sizin için de oluşturur. Sadece hangi sırayı yaptığınıza dikkat etmeli ve tetikleyicileri ne zaman açacağınızı veya kapatacağınızı bilmelisiniz.
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;
Bunu yapabilirsiniz
Create table New_table as
select * from Old_table where 1=2 ;
ama dikkatli olun
Doz oluşturduğunuz tabloda herhangi bir Index, Pk vb.
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;
Bir başkasının şemasını kullanarak yeni, boş bir tablo oluşturun. Sorgunun veri döndürmemesine neden olan bir WHERE deyimi eklemeniz yeterlidir:
Bunun gibi bir sorgu yazmanız yeterlidir:
create table new_table as select * from old_table where 1=2;
burada new_table
oluşturmak istediğiniz yeni tablonun old_table
adı ve yapısını kopyalamak istediğiniz varolan tablonun adı, bu yalnızca yapıyı kopyalar.
WHERE 1 = 0
ya da benzer yanlış koşullar işe yarar, ama nasıl göründüklerinden hoşlanmıyorum. Oracle 12c + IMHO için marjinal olarak temiz kod
CREATE TABLE bar AS
SELECT *
FROM foo
FETCH FIRST 0 ROWS ONLY;
Aynı sınırlamalar geçerlidir: yalnızca sütun tanımları ve nullabiliteleri yeni bir tabloya kopyalanır.
Başka bir şekilde, aşağıda listelenen komuttan ddl tablo oluşturma işlemini alabilir ve oluşturma işlemini yürütebilirsiniz.
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
TYPE
olduğu TABLE
, PROCEDURE
vs.Bu komutla ddl'nin büyük bir kısmını veritabanı nesnelerinden alabilirsiniz.
GET_DDL
büyük / küçük harfe duyarlıdır.
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table, yapısını kopyalamak istediğiniz tablodur.
Pl / sql geliştirici kullanarak sql çalışma alanında veya nesne gezgini içinde table_name sağ tıklayın, daha sonra "view" tıklayın ve sonra tüm kısıtlamalarla birlikte tablo oluşturmak için sql komut dosyası üreten "view sql" tıklayın , dizinler, bölümler vb.
Sonra komut dosyasını new_table_name kullanarak çalıştırın
- xyz'den select * olarak tablo xyz_new oluşturun;
- Bu tablo oluşturur ve tüm verileri kopyalar.
- xyz_new'den sil;
- Bu, aynı tablo yapısına sahip olacak ancak kopyalanan tüm veriler silinecek.
Yanıtla belirtilen sınırlamaların üstesinden gelmek istiyorsanız: Verileri kopyalamadan Oracle tablosunun bir kopyasını nasıl oluşturabilirim?
Yukarıdaki görev iki basit adımda tamamlanabilir.
CREATE table new_table_name AS(Select * from old_table_name);
query
Yukarıdaki (içeriği ile de) Bir tablonun bir kopyası oluşturulur.
Yapıyı elde etmek için öğesini kullanarak tablonun içeriğini silin.
DELETE * FROM new_table_name.
Umarız bu sorununuzu çözer. Ve daha önceki gönderiler sayesinde. Bana çok fazla fikir verdi.
truncate
sürümden bile daha az verimlidir . Tüm veriler için uzantılar ayırmanın yanı sıra, bunları silerek serbest bırakmazsınız. Hem ekleme hem de silme işlemlerinde geri al / yinele oluşturuyorsunuz. Jim'in cevabı basitçe tüm bunlardan kaçınır.