Verileri kopyalamadan Oracle tablosunun bir kopyasını nasıl oluşturabilirim?


Yanıtlar:


420

Herhangi bir satır seçmeyen bir where yan tümcesi kullanın:

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

Sınırlamalar

Aşağıdaki şeyler yeni tabloya kopyalanmaz:

  • dizileri
  • tetikleyiciler
  • indeksleri
  • bazı kısıtlamalar kopyalanamayabilir
  • materyalize görünüm günlükleri

Bu ayrıca bölümleri işlemez



53
Bu harika, temiz bir cevap. Sadece bu edeceğini hatırlatmak istiyorum değil herhangi kısıtlamaları dahil .. yeni tablo bile birincil anahtara sahip olmayacaktır.
JosephStyons

18
bu, sıraları veya tetikleyicileri çoğaltmaz.
branchgabriel

16
ne de yeni tablo herhangi bir dizin olacak - yeni masada büyük bir sorgu yapmaya çalışırken yakalanmayın :-)
hamishmcn

8
bölümleri de işlemez. Ama hey.
MK.

17
Hemen Zeyilname - bu olacak ihtiva bazı kısıtlamalar - yani herhangi DEĞİL BOŞ kısıtlamaları kopyalanacaktır.
Jeffrey Kemp

84

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;

Başka bir şemadan kopyalamak istiyorsanız bu komut nasıl değiştirilecektir.
kushalvm

My_table_namemevcut tablodur. Ancak yeni masamın adını nasıl oluşturabilirim?
kushalvm

Cevabımdaki komut yeni tablo oluşturmuyor; özgün tabloyu yeniden oluşturmak için kullanacağınız SQL'i döndürür. İstediğiniz gibi değiştirin ve çalıştırın. Dolayısıyla, yeni tablonun adı belirtmek istediğiniz her şeydir.
Dave Costa

5
Bu yüzden yukarıdaki sql komutunu bir değişkene atamak gibi olmalıdır. ryt? Örneğin . 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.
kushalvm

15

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.


Oracle SQL Developer v.18.3'te sekme çağrılırSQL
Metafaniel

14
create table xyz_new as select * from xyz where rownum = -1;

Tekrar tekrar tekrarlamak ve 1 = 2 koşuluna göre hiçbir şey eklemek için


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

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.


2
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:


1

ayrıca bir

create table abc_new as select * from abc; 

sonra masayı kesin abc_new. Umarım bu sizin ihtiyacınızı karşılar.


11
Tabii ki, orijinal tabloda çok fazla veri varsa, bu gerçekten çok kötü bir fikir olabilir. ;)
Alexios

1

Bunun gibi bir sorgu yazmanız yeterlidir:

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

burada new_tableoluşturmak istediğiniz yeni tablonun old_tableadı ve yapısını kopyalamak istediğiniz varolan tablonun adı, bu yalnızca yapıyı kopyalar.


1

WHERE 1 = 0ya 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.


1

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 
  • TYPEolduğu TABLE, PROCEDUREvs.

Bu komutla ddl'nin büyük bir kısmını veritabanı nesnelerinden alabilirsiniz.


Değişkeni GET_DDLbüyük / küçük harfe duyarlıdır.
Sridhar Sarnobat

0
Create table target_table 
As
Select * 
from source_table 
where 1=2;

Source_table, yapısını kopyalamak istediğiniz tablodur.


0

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


0

tablo verisi olmadan kopyala

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

tablo verileriyle kopyala

create table <target_table> as select * from <source_table>;


-5

Yukarıdaki görev iki basit adımda tamamlanabilir.

AŞAMA 1:

CREATE table new_table_name AS(Select * from old_table_name);

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

ADIM 2:

DELETE * FROM new_table_name.

Umarız bu sorununuzu çözer. Ve daha önceki gönderiler sayesinde. Bana çok fazla fikir verdi.


13
Bu truncatesü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.
Alex Poole
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.