Làm thế nào tôi có thể tạo một bản sao của bảng Oracle mà không sao chép dữ liệu?


Câu trả lời:


420

Chỉ cần sử dụng mệnh đề where sẽ không chọn bất kỳ hàng nào:

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

Hạn chế

Những điều sau đây sẽ không được sao chép vào bảng mới:

  • trình tự
  • gây nên
  • chỉ số
  • một số hạn chế có thể không được sao chép
  • nhật ký xem cụ thể hóa

Điều này cũng không xử lý phân vùng



53
Đây là một câu trả lời tuyệt vời, sạch sẽ. Chỉ muốn nhắc nhở rằng điều này sẽ không bao gồm bất kỳ ràng buộc nào .. bảng mới thậm chí sẽ không có khóa chính.
JosephStyons

18
điều này sẽ không sao chép trình tự hoặc kích hoạt.
Branchgabriel

16
Bảng mới cũng không có bất kỳ chỉ mục nào - đừng bị bắt gặp khi cố gắng thực hiện một truy vấn lớn trên bảng mới :-)
hamishmcn

8
cũng không xử lý các phân vùng. Nhưng này.
MK.

17
Chỉ là một phụ lục - nó sẽ chứa một số ràng buộc - tức là mọi ràng buộc KHÔNG NULL sẽ được sao chép.
Jeffrey Kemp

84

Tôi đã sử dụng phương pháp mà bạn chấp nhận rất nhiều, nhưng như ai đó đã chỉ ra, nó không trùng lặp các ràng buộc (ngoại trừ KHÔNG NULL, tôi nghĩ vậy).

Một phương pháp nâng cao hơn nếu bạn muốn sao chép toàn bộ cấu trúc là:

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

Điều này sẽ cung cấp cho bạn văn bản câu lệnh tạo đầy đủ mà bạn có thể sửa đổi theo ý muốn để tạo bảng mới. Bạn sẽ phải thay đổi tên của bảng và tất cả các ràng buộc tất nhiên.

(Bạn cũng có thể thực hiện việc này trong các phiên bản cũ hơn bằng EXP / IMP, nhưng giờ thì dễ dàng hơn nhiều.)

Đã chỉnh sửa để thêm Nếu bảng bạn theo sau nằm trong một lược đồ khác:

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

Lệnh này sẽ được sửa đổi như thế nào nếu tôi muốn sao chép từ một lược đồ khác.
kushalvm

My_table_namelà bảng hiện có. Nhưng làm thế nào để tôi có được tên của bảng mới của tôi được tạo ra?
kushalvm

Lệnh trong câu trả lời của tôi không tạo bảng mới; nó trả về SQL mà bạn sẽ sử dụng để tạo lại bảng gốc. Bạn sửa đổi nó như mong muốn sau đó chạy nó. Vì vậy, tên của bảng mới là bất cứ điều gì bạn chọn để chỉ định.
Dave Costa

5
Vì nó phải giống như gán lệnh sql ở trên cho một biến. ryt? ví dụ . new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). Trong khi đó xin vui lòng cho tôi biết những gì LONG làm ở đây.
kushalvm

15

Sử dụng nhà phát triển sql chọn bảng và nhấp vào tab DDL

Bạn có thể sử dụng mã đó để tạo một bảng mới không có dữ liệu khi bạn chạy nó trong bảng tính sql

sqldeveloper là một ứng dụng miễn phí từ nhà tiên tri.

Nếu bảng có trình tự hoặc kích hoạt, ddl đôi khi cũng sẽ tạo ra những thứ đó cho bạn. Bạn chỉ cần cẩn thận theo thứ tự bạn thực hiện chúng và biết khi nào nên bật hoặc tắt kích hoạt.


Trong Oracle SQL Developer v.18.3, tab được gọi làSQL
Metafaniel

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

Để tránh lặp đi lặp lại nhiều lần và không chèn gì dựa trên điều kiện 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

Bạn có thể làm điều này Create table New_table as select * from Old_table where 1=2 ; nhưng hãy cẩn thận Bảng bạn tạo liều không có bất kỳ Chỉ số, LOL nào, v.v. như old_table


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

Tạo một bảng mới, trống bằng cách sử dụng lược đồ của bảng khác. Chỉ cần thêm mệnh đề WHERE khiến truy vấn không trả lại dữ liệu:


1

bạn cũng có thể làm một

create table abc_new as select * from abc; 

sau đó cắt ngắn bảng abc_new. Hy vọng điều này sẽ đủ yêu cầu của bạn.


11
Tất nhiên, nếu bạn có RẤT NHIỀU dữ liệu trong bảng gốc, đây có thể là một ý tưởng thực sự, thực sự tồi tệ. ;)
Alexios

1

Chỉ cần viết một truy vấn như:

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

trong đó new_tabletên của bảng mới mà bạn muốn tạo và old_tablelà tên của bảng hiện có có cấu trúc bạn muốn sao chép, đây sẽ chỉ sao chép cấu trúc.


1

WHERE 1 = 0hoặc điều kiện sai tương tự hoạt động, nhưng tôi không thích cách họ nhìn. Mã sạch hơn cho Oracle 12c + IMHO là

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

Áp dụng các giới hạn tương tự: chỉ các định nghĩa cột và tính vô hiệu của chúng được sao chép vào một bảng mới.


1

Theo cách khác, bạn có thể nhận được ddl của việc tạo bảng từ lệnh được liệt kê bên dưới và thực hiện việc tạo.

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPETABLE, PROCEDUREv.v.

Với lệnh này, bạn có thể nhận được phần lớn ddl từ các đối tượng cơ sở dữ liệu.


Lưu ý rằng các đối số GET_DDLlà trường hợp nhạy cảm.
Sridhar Sarnobat

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

Source_table là bảng bạn muốn sao chép cấu trúc của.


0

Sử dụng nhà phát triển pl / sql, bạn có thể nhấp chuột phải vào tên_bảng trong không gian làm việc sql hoặc trong trình thám hiểm đối tượng, hơn là nhấp vào "view" và nhấp vào "view sql" để tạo tập lệnh sql để tạo bảng cùng với tất cả các ràng buộc , chỉ mục, phân vùng, v.v.

Tiếp theo, bạn chạy tập lệnh bằng new_table_name


0

sao chép mà không có dữ liệu bảng

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

sao chép với dữ liệu bảng

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


-5

Nhiệm vụ trên có thể được hoàn thành trong hai bước đơn giản.

BƯỚC 1:

CREATE table new_table_name AS(Select * from old_table_name);

querytrên tạo ra một bản sao của một bảng (cũng có nội dung).

Để có được cấu trúc, xóa nội dung của bảng bằng cách sử dụng.

BƯỚC 2:

DELETE * FROM new_table_name.

Hy vọng điều này sẽ giải quyết vấn đề của bạn. Và cảm ơn các bài viết trước đó. Đã cho tôi rất nhiều cái nhìn sâu sắc.


13
Điều này thậm chí còn kém hiệu quả hơn truncatephiên bản. Cũng như phân bổ phạm vi cho tất cả dữ liệu, bạn không giải phóng chúng bằng cách xóa, do đó bạn có khả năng lãng phí không gian trừ khi bảng phát triển theo kích thước cũ. Và bạn đang tạo hoàn tác / làm lại trên cả chèn và xóa. Câu trả lời của Jim rất đơn giản là tránh tất cả những điều đó.
Alex Poole
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.