ฉันรู้ว่าคำสั่ง:
create table xyz_new as select * from xyz;
คัดลอกโครงสร้างและข้อมูลใด แต่ถ้าฉันต้องการโครงสร้าง
ฉันรู้ว่าคำสั่ง:
create table xyz_new as select * from xyz;
คัดลอกโครงสร้างและข้อมูลใด แต่ถ้าฉันต้องการโครงสร้าง
คำตอบ:
เพียงใช้ส่วนคำสั่งที่จะไม่เลือกแถวใด ๆ :
create table xyz_new as select * from xyz where 1=0;
สิ่งต่อไปนี้จะไม่ถูกคัดลอกไปยังตารางใหม่:
นี่ยังไม่จัดการกับพาร์ติชัน
ฉันใช้วิธีที่คุณยอมรับมาก แต่เนื่องจากมีคนชี้ให้เห็นว่ามันไม่ได้เป็นข้อ จำกัด ที่ซ้ำกัน (ยกเว้น 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;
My_table_name
เป็นตารางที่มีอยู่ แต่ฉันจะสร้างชื่อของตารางใหม่ของฉันได้อย่างไร
new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ).
ในขณะเดียวกันโปรดแจ้งให้เราทราบว่า LONG ทำอะไรที่นี่
การใช้นักพัฒนา sql เลือกตารางและคลิกที่แท็บ DDL
คุณสามารถใช้รหัสนั้นเพื่อสร้างตารางใหม่โดยไม่มีข้อมูลเมื่อคุณเรียกใช้ในแผ่นงาน sql
sqldeveloper เป็นแอพที่ใช้งานได้ฟรีจาก oracle
หากตารางมีลำดับหรือทริกเกอร์ ddl บางครั้งจะสร้างสิ่งเหล่านั้นให้คุณเช่นกัน คุณเพียงแค่ต้องระวังสิ่งที่คุณสั่งให้พวกเขาในและรู้ว่าเมื่อใดที่จะเปิดหรือปิดทริกเกอร์
SQL
create table xyz_new as select * from xyz where rownum = -1;
เพื่อหลีกเลี่ยงการวนซ้ำซ้ำแล้วซ้ำอีกและใส่อะไรตามเงื่อนไขที่ 1 = 2
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;
คุณสามารถทำได้
Create table New_table as
select * from Old_table where 1=2 ;
แต่ต้องระวัง
ตารางที่คุณสร้างยาไม่มีดัชนี, Pk และอื่น ๆ เช่น old_table
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;
สร้างตารางใหม่ที่ว่างเปล่าโดยใช้สคีมาของอีกอัน เพียงเพิ่มส่วนคำสั่ง WHERE ที่ทำให้แบบสอบถามไม่ส่งคืนข้อมูล:
คุณยังสามารถทำ
create table abc_new as select * from abc;
abc_new
แล้วตัดตาราง หวังว่านี่จะเพียงพอต่อความต้องการของคุณ
เพียงเขียนแบบสอบถามเช่น:
create table new_table as select * from old_table where 1=2;
โดยที่new_table
เป็นชื่อของตารางใหม่ที่คุณต้องการสร้างและold_table
เป็นชื่อของตารางที่มีอยู่ซึ่งมีโครงสร้างที่คุณต้องการคัดลอกซึ่งจะเป็นการคัดลอกโครงสร้างเท่านั้น
WHERE 1 = 0
หรือเงื่อนไขเท็จที่คล้ายกันทำงาน แต่ฉันไม่ชอบว่าพวกเขามองอย่างไร โค้ดที่สะอาดเล็กน้อยสำหรับ Oracle 12c + IMHO คือ
CREATE TABLE bar AS
SELECT *
FROM foo
FETCH FIRST 0 ROWS ONLY;
ใช้ข้อ จำกัด เดียวกัน: คำจำกัดความของคอลัมน์เท่านั้นและความสามารถในการลบล้างถูกคัดลอกไปยังตารางใหม่
ในทางอื่นคุณสามารถรับ ddl ของการสร้างตารางจากคำสั่งที่แสดงด้านล่างและดำเนินการสร้าง
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
TYPE
คือTABLE
, PROCEDURE
ฯลฯด้วยคำสั่งนี้คุณสามารถได้รับส่วนใหญ่ ddl จากวัตถุฐานข้อมูล
GET_DDL
เป็นกรณี ๆ ไป
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table เป็นตารางที่คุณต้องการคัดลอกโครงสร้างของ
การใช้ผู้พัฒนา pl / sql คุณสามารถคลิกขวาที่ table_name ในพื้นที่ทำงาน sql หรือใน object explorer กว่าคลิกที่ "ดู" และคลิก "view sql" ซึ่งสร้างสคริปต์ sql เพื่อสร้างตารางพร้อมกับข้อ จำกัด ทั้งหมด ดัชนีพาร์ทิชัน ฯลฯ
ถัดไปคุณเรียกใช้สคริปต์โดยใช้ new_table_name
create table <target_table> as select * from <source_table> where 1=2;
create table <target_table> as select * from <source_table>;
- สร้างตาราง xyz_new เป็น select * จาก xyz;
- สิ่งนี้จะสร้างตารางและคัดลอกข้อมูลทั้งหมด
- ลบจาก xyz_new;
- สิ่งนี้จะมีโครงสร้างตารางเดียวกัน แต่ข้อมูลที่คัดลอกทั้งหมดจะถูกลบ
หากคุณต้องการเอาชนะข้อ จำกัด ที่ระบุโดยคำตอบ: ฉันจะสร้างสำเนาของตาราง Oracle โดยไม่คัดลอกข้อมูลได้อย่างไร
งานด้านบนสามารถทำได้ในสองขั้นตอนง่ายๆ
CREATE table new_table_name AS(Select * from old_table_name);
query
ข้างต้นสร้างซ้ำกันของตาราง (มีเนื้อหาเช่นกัน)
ในการรับโครงสร้างลบเนื้อหาของตารางโดยใช้
DELETE * FROM new_table_name.
หวังว่านี่จะช่วยแก้ปัญหาของคุณ และต้องขอบคุณโพสต์ก่อนหน้า ทำให้ฉันมีความเข้าใจอย่างถ่องแท้
truncate
รุ่นนี้ เช่นเดียวกับการจัดสรรส่วนขยายสำหรับข้อมูลทั้งหมดคุณไม่ได้ฟรีโดยการลบดังนั้นคุณอาจเสียพื้นที่หากตารางเติบโตขึ้นเป็นขนาดเก่า และคุณกำลังสร้างเลิกทำ / ทำซ้ำทั้งในการแทรกและลบ คำตอบของจิมหลีกเลี่ยงสิ่งเหล่านั้นทั้งหมด