Відповіді:
Просто використовуйте пункт де не вибирає жодних рядків:
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
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 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, ви можете клацнути правою кнопкою миші на ім'я таблиці або в робочій області sql або в провіднику об'єктів, ніж натиснути на "view", а потім натиснути "view sql", що генерує скрипт sql для створення таблиці разом з усіма обмеженнями. , індекси, розділи тощо.
Далі ви запускаєте сценарій, використовуючи ім'я new_table_name
- створити таблицю 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
версія. Окрім виділення розширень для всіх даних, ви не звільняєте їх, видаляючи, тому ви потенційно витрачаєте місце, якщо таблиця не виросте до старого розміру. І ви генеруєте скасувати / повторити і вставку, і видалення. Відповідь Джима дуже просто уникає всього цього.