ฉันจะสร้างสำเนาของตาราง Oracle โดยไม่คัดลอกข้อมูลได้อย่างไร


คำตอบ:


420

เพียงใช้ส่วนคำสั่งที่จะไม่เลือกแถวใด ๆ :

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

ข้อ จำกัด

สิ่งต่อไปนี้จะไม่ถูกคัดลอกไปยังตารางใหม่:

  • ลำดับ
  • ทริกเกอร์
  • ดัชนี
  • ข้อ จำกัด บางอย่างอาจไม่สามารถคัดลอกได้
  • บันทึกมุมมองที่ปรากฏ

นี่ยังไม่จัดการกับพาร์ติชัน



53
นี่เป็นคำตอบที่ดีและสะอาด แค่ต้องการเตือนว่านี่จะไม่รวมถึงข้อ จำกัด ใด ๆ .. ตารางใหม่จะไม่มีแม้แต่คีย์หลัก
JosephStyons

18
สิ่งนี้จะไม่ทำซ้ำลำดับหรือทริกเกอร์
branchgabriel

16
หรือตารางใหม่จะมีดัชนีใด ๆ - ไม่ได้รับการติดออกพยายามที่จะทำแบบสอบถามใหญ่ในตารางใหม่ :-)
hamishmcn

8
ยังไม่ได้จัดการกับพาร์ทิชัน แต่เฮ้
MK

17
เพียงแค่ภาคผนวก - มันจะมีข้อ จำกัดบางประการ - เช่นข้อ จำกัด NOT NULL ใด ๆ จะถูกคัดลอก
เจฟฟรีย์เคมพ์

84

ฉันใช้วิธีที่คุณยอมรับมาก แต่เนื่องจากมีคนชี้ให้เห็นว่ามันไม่ได้เป็นข้อ จำกัด ที่ซ้ำกัน (ยกเว้น NOT NULL ฉันคิดว่า)

วิธีการขั้นสูงเพิ่มเติมหากคุณต้องการทำซ้ำโครงสร้างแบบเต็มคือ:

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

นี่จะให้ข้อความสร้างแบบเต็มซึ่งคุณสามารถแก้ไขได้ตามที่คุณต้องการสำหรับการสร้างตารางใหม่ คุณจะต้องเปลี่ยนชื่อของตารางและข้อ จำกัด ทั้งหมดของหลักสูตร

(คุณสามารถทำได้ในรุ่นเก่าโดยใช้ EXP / IMP แต่ตอนนี้มันง่ายกว่ามาก)

แก้ไขเพื่อเพิ่ม หากตารางที่คุณอยู่หลังจากนั้นอยู่ในสคีมาที่แตกต่างกัน:

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;

คำสั่งนี้จะถูกแก้ไขอย่างไรถ้าฉันต้องการคัดลอกจากสคีมาอื่น
kushalvm

My_table_nameเป็นตารางที่มีอยู่ แต่ฉันจะสร้างชื่อของตารางใหม่ของฉันได้อย่างไร
kushalvm

คำสั่งในคำตอบของฉันไม่ได้สร้างตารางใหม่ มันคืนค่า SQL ที่คุณจะใช้เพื่อสร้างตารางเดิม คุณปรับเปลี่ยนได้ตามที่ต้องการแล้วเรียกใช้ ดังนั้นชื่อของตารางใหม่จึงเป็นสิ่งที่คุณเลือกระบุ
Dave Costa

5
ดังนั้นมันจะต้องเป็นเหมือนการกำหนดคำสั่ง sql ข้างต้นให้กับตัวแปร ryt เช่น . new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). ในขณะเดียวกันโปรดแจ้งให้เราทราบว่า LONG ทำอะไรที่นี่
kushalvm

15

การใช้นักพัฒนา sql เลือกตารางและคลิกที่แท็บ DDL

คุณสามารถใช้รหัสนั้นเพื่อสร้างตารางใหม่โดยไม่มีข้อมูลเมื่อคุณเรียกใช้ในแผ่นงาน sql

sqldeveloper เป็นแอพที่ใช้งานได้ฟรีจาก oracle

หากตารางมีลำดับหรือทริกเกอร์ ddl บางครั้งจะสร้างสิ่งเหล่านั้นให้คุณเช่นกัน คุณเพียงแค่ต้องระวังสิ่งที่คุณสั่งให้พวกเขาในและรู้ว่าเมื่อใดที่จะเปิดหรือปิดทริกเกอร์


ใน Oracle SQL Developer v.18.3 แท็บนั้นมีชื่อว่าSQL
Metafaniel

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

เพื่อหลีกเลี่ยงการวนซ้ำซ้ำแล้วซ้ำอีกและใส่อะไรตามเงื่อนไขที่ 1 = 2


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

คุณสามารถทำได้ Create table New_table as select * from Old_table where 1=2 ; แต่ต้องระวัง ตารางที่คุณสร้างยาไม่มีดัชนี, Pk และอื่น ๆ เช่น old_table


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

สร้างตารางใหม่ที่ว่างเปล่าโดยใช้สคีมาของอีกอัน เพียงเพิ่มส่วนคำสั่ง WHERE ที่ทำให้แบบสอบถามไม่ส่งคืนข้อมูล:


1

คุณยังสามารถทำ

create table abc_new as select * from abc; 

abc_newแล้วตัดตาราง หวังว่านี่จะเพียงพอต่อความต้องการของคุณ


11
แน่นอนถ้าคุณมีข้อมูลจำนวนมากในตารางดั้งเดิมนี่อาจเป็นความคิดที่แย่จริงๆ ;)
Alexios

1

เพียงเขียนแบบสอบถามเช่น:

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

โดยที่new_tableเป็นชื่อของตารางใหม่ที่คุณต้องการสร้างและold_tableเป็นชื่อของตารางที่มีอยู่ซึ่งมีโครงสร้างที่คุณต้องการคัดลอกซึ่งจะเป็นการคัดลอกโครงสร้างเท่านั้น


1

WHERE 1 = 0หรือเงื่อนไขเท็จที่คล้ายกันทำงาน แต่ฉันไม่ชอบว่าพวกเขามองอย่างไร โค้ดที่สะอาดเล็กน้อยสำหรับ Oracle 12c + IMHO คือ

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

ใช้ข้อ จำกัด เดียวกัน: คำจำกัดความของคอลัมน์เท่านั้นและความสามารถในการลบล้างถูกคัดลอกไปยังตารางใหม่


1

ในทางอื่นคุณสามารถรับ ddl ของการสร้างตารางจากคำสั่งที่แสดงด้านล่างและดำเนินการสร้าง

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPEคือTABLE, PROCEDUREฯลฯ

ด้วยคำสั่งนี้คุณสามารถได้รับส่วนใหญ่ ddl จากวัตถุฐานข้อมูล


โปรดทราบว่าข้อโต้แย้งที่GET_DDLเป็นกรณี ๆ ไป
Sridhar Sarnobat

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

Source_table เป็นตารางที่คุณต้องการคัดลอกโครงสร้างของ


0

การใช้ผู้พัฒนา pl / sql คุณสามารถคลิกขวาที่ table_name ในพื้นที่ทำงาน sql หรือใน object explorer กว่าคลิกที่ "ดู" และคลิก "view sql" ซึ่งสร้างสคริปต์ sql เพื่อสร้างตารางพร้อมกับข้อ จำกัด ทั้งหมด ดัชนีพาร์ทิชัน ฯลฯ

ถัดไปคุณเรียกใช้สคริปต์โดยใช้ new_table_name


0

คัดลอกโดยไม่มีข้อมูลตาราง

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

คัดลอกด้วยข้อมูลตาราง

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

0
  1. สร้างตาราง xyz_new เป็น select * จาก xyz;

- สิ่งนี้จะสร้างตารางและคัดลอกข้อมูลทั้งหมด

  1. ลบจาก xyz_new;

- สิ่งนี้จะมีโครงสร้างตารางเดียวกัน แต่ข้อมูลที่คัดลอกทั้งหมดจะถูกลบ

หากคุณต้องการเอาชนะข้อ จำกัด ที่ระบุโดยคำตอบ: ฉันจะสร้างสำเนาของตาราง Oracle โดยไม่คัดลอกข้อมูลได้อย่างไร


-5

งานด้านบนสามารถทำได้ในสองขั้นตอนง่ายๆ

ขั้นตอนที่ 1:

CREATE table new_table_name AS(Select * from old_table_name);

queryข้างต้นสร้างซ้ำกันของตาราง (มีเนื้อหาเช่นกัน)

ในการรับโครงสร้างลบเนื้อหาของตารางโดยใช้

ขั้นตอนที่ 2:

DELETE * FROM new_table_name.

หวังว่านี่จะช่วยแก้ปัญหาของคุณ และต้องขอบคุณโพสต์ก่อนหน้า ทำให้ฉันมีความเข้าใจอย่างถ่องแท้


13
แม้จะมีประสิทธิภาพน้อยกว่าtruncateรุ่นนี้ เช่นเดียวกับการจัดสรรส่วนขยายสำหรับข้อมูลทั้งหมดคุณไม่ได้ฟรีโดยการลบดังนั้นคุณอาจเสียพื้นที่หากตารางเติบโตขึ้นเป็นขนาดเก่า และคุณกำลังสร้างเลิกทำ / ทำซ้ำทั้งในการแทรกและลบ คำตอบของจิมหลีกเลี่ยงสิ่งเหล่านั้นทั้งหมด
Alex Poole
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.