Câu trả lời:
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;
Những điều sau đây sẽ không được sao chép vào bảng mới:
Điều này cũng không xử lý phân vùng
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;
My_table_name
là 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?
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.
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.
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;
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
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:
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_table
tên của bảng mới mà bạn muốn tạo và old_table
là 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.
WHERE 1 = 0
hoặ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.
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
TYPE
là TABLE
, PROCEDURE
v.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.
GET_DDL
là trường hợp nhạy cảm.
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.
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
- tạo bảng xyz_new khi chọn * từ xyz;
- Điều này sẽ tạo bảng và sao chép tất cả dữ liệu.
- xóa khỏi xyz_new;
- Điều này sẽ có cùng cấu trúc bảng nhưng tất cả dữ liệu được sao chép sẽ bị xóa.
Nếu bạn muốn khắc phục các giới hạn được chỉ định bởi câu trả lời: Làm cách nào tôi có thể tạo một bản sao của bảng Oracle mà không cần sao chép dữ liệu?
Nhiệm vụ trên có thể được hoàn thành trong hai bước đơn giản.
CREATE table new_table_name AS(Select * from old_table_name);
Ở query
trê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.
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.
truncate
phiê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 đó.