Как я могу создать копию таблицы Oracle без копирования данных?

Я знаю утверждение:

create table xyz_new as select * from xyz;

Что копирует структуру и данные, но что, если мне просто нужна структура?


person Andrew    schedule 24.10.2008    source источник
comment
Связано: stackoverflow.com/questions/11472519/   -  person AlikElzin-kilaka    schedule 09.07.2015


Ответы (16)


Просто используйте предложение where, которое не выбирает никакие строки:

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

Ограничения

Следующие вещи не будут скопированы в новую таблицу:

  • последовательности
  • триггеры
  • индексы
  • некоторые ограничения не могут быть скопированы
  • материализованные журналы просмотра

Это также не обрабатывает разделы


person Jim Hudson    schedule 24.10.2008
comment
Это отличный чистый ответ. Просто хочу напомнить, что это не будет включать никаких ограничений .. у новой таблицы даже не будет первичного ключа. - person JosephStyons; 24.10.2008
comment
это также не будет воспроизводить последовательности или триггеры. - person branchgabriel; 24.10.2008
comment
и у новой таблицы не будет никаких индексов - не попадитесь, пытаясь сделать большой запрос к новой таблице :-) - person hamishmcn; 01.11.2008
comment
также не обрабатывает разделы. Но эй. - person MK.; 20.10.2011
comment
Просто дополнение - оно будет содержать некоторые ограничения, т.е. любые ограничения NOT NULL будут скопированы. - person Jeffrey Kemp; 29.08.2012
comment
Подойдет для некоторых простых случаев, но для более сложных ситуаций может потребоваться много дополнительных накладных расходов. Пример при использовании табличных функций, табличная функция все еще должна быть выполнена. Могут быть и другие случаи, когда оптимизатор не может эффективно оптимизировать 1 = 0 и заставляет выполнять большие фрагменты подзапроса. - person YoYo; 09.04.2015
comment
именно то, что мне нужно - person Pieter De Bie; 19.08.2015
comment
Что значит where 1=0? - person Dylan Czenski; 12.01.2016
comment
@Jim Я скопировал некоторые ограничения из комментариев. Я не dba, так что, возможно, ошибаюсь. - person jpaugh; 24.10.2016
comment
@DylanChensky 1=0 - это логическое условие, которое всегда будет оцениваться как false. YoYo говорит, что иногда оптимизатор этого не понимает (из-за окружающих выражений в сложной ситуации) и пытается искать строки, в которых 1=0 истинно. - person jpaugh; 24.10.2016
comment
Также не копирует определения DATA_DEFAULT столбца. - person user909481; 22.11.2017
comment
@DylanCzenski это нужно только потому, что вам нужна только структура без каких-либо данных, и это выражение дает вам нулевой результат только `` заголовок '' - person SüniÚr; 17.07.2018
comment
@JeffreyKemp ... Если мне нужно включить индекс и разделы при создании новой таблицы, что мне делать? - person Vaibhav Gupta; 06.04.2020
comment
@VaibhavGupta, вам лучше просто получить определение таблицы (например, используя dbms_metadata или такой инструмент, как SQL Developer) и использовать его для создания вашей новой таблицы. Задокументированный здесь трюк предназначен для быстрых и неприятных копий без наворотов. - person Jeffrey Kemp; 06.04.2020

Я использовал метод, который вы часто принимали, но, как кто-то заметил, он не дублирует ограничения (за исключением 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;
person Dave Costa    schedule 27.10.2008
comment
Как эта команда будет изменена, если я хочу скопировать из другой схемы. - person HalfWebDev; 15.07.2013
comment
My_table_name - существующая таблица. Но как мне получить имя моей новой созданной таблицы? - person HalfWebDev; 18.07.2013
comment
Команда в моем ответе не создает новую таблицу; он возвращает SQL, который вы использовали бы для воссоздания исходной таблицы. Вы изменяете его по своему усмотрению, а затем запускаете. Таким образом, имя новой таблицы будет любым, которое вы укажете. - person Dave Costa; 18.07.2013
comment
Итак, это должно быть похоже на присвоение указанной выше команды sql переменной. рыть? напр. new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). А пока дайте мне знать, что здесь делает LONG. - person HalfWebDev; 18.07.2013

Используя sql Developer, выберите таблицу и щелкните вкладку DDL

Вы можете использовать этот код для создания новой таблицы без данных при запуске на листе sql.

sqldeveloper - бесплатное приложение от Oracle.

Если в таблице есть последовательности или триггеры, ddl иногда генерирует их и для вас. Вам просто нужно быть осторожным в том, в каком порядке вы их размещаете, и знать, когда включать или выключать триггеры.

person branchgabriel    schedule 24.10.2008
comment
В Oracle SQL Developer v.18.3 вкладка называется SQL - person Metafaniel; 22.01.2019

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

Чтобы избежать повторения снова и снова и ничего не вставлять на основе условия, где 1 = 2

person sunleo    schedule 21.12.2013

Вы можете сделать это Create table New_table as select * from Old_table where 1=2 ; но будьте осторожны. Созданная вами таблица не имеет индекса, PK и т. Д., Как old_table.

person Mohsen Molaei    schedule 10.12.2015

Просто напишите такой запрос:

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

где new_table - имя новой таблицы, которую вы хотите создать, а old_table - имя существующей таблицы, структуру которой вы хотите скопировать, при этом будет скопирована только структура.

person user3284249    schedule 07.02.2014

SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

Создайте новую пустую таблицу, используя схему другой. Просто добавьте предложение WHERE, которое заставляет запрос не возвращать данные:

person guesswho    schedule 31.08.2017

Если нужно создать таблицу (с пустой структурой) только для ОБМЕНА РАЗДЕЛОМ, лучше всего использовать предложение ..FOR EXCHANGE ... Однако он доступен только начиная с версии Oracle 12.2.

CREATE TABLE t1_temp FOR EXCHANGE WITH TABLE t1;

Это беспрепятственно адресует «ORA-14097» во время «раздела обмена», если структуры таблиц точно не копируются при нормальной работе CTAS. Я видел, как Oracle не хватает некоторых определений столбца DEFAULT и HIDDEN из исходной таблицы.

ORA-14097: несоответствие типа или размера столбца в ALTER TABLE EXCHANGE PARTITION

См. Это для дальнейшего чтения ...

person pahariayogi    schedule 06.10.2020

вы также можете сделать

create table abc_new as select * from abc; 

затем обрежьте таблицу abc_new. Надеюсь, этого будет достаточно.

person Digo    schedule 24.02.2011
comment
Конечно, если у вас много данных в исходной таблице, это может быть действительно очень плохой идеей. ;) - person Alexios; 10.10.2013

Используя pl / sql developer, вы можете щелкнуть правой кнопкой мыши имя_таблицы либо в рабочей области sql, либо в проводнике объектов, затем щелкнуть «view» и затем щелкнуть «view sql», который генерирует sql-скрипт для создания таблицы со всеми ограничениями. , индексы, разделы и т. д.

Затем вы запускаете скрипт, используя new_table_name

person Yariv Scheingut    schedule 11.06.2015

копировать без табличных данных

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

копировать с табличными данными

create table <target_table> as select * from <source_table>;
person Alok    schedule 16.04.2017

WHERE 1 = 0 или похожие ложные условия работают, но мне не нравится, как они выглядят. Незначительно более чистый код для Oracle 12c + IMHO - это

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

Применяются те же ограничения: в новую таблицу копируются только определения столбцов и их допустимость значений NULL.

person DKroot    schedule 16.02.2018

Другим способом вы можете получить ddl создания таблицы из команды, указанной ниже, и выполнить создание.

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPE равно _3 _, _ 4_ и т. Д.

С помощью этой команды вы можете получить большую часть ddl из объектов базы данных.

person Diogo Maschio    schedule 19.08.2015
comment
Обратите внимание, что аргументы GET_DDL чувствительны к регистру. - person Sridhar Sarnobat; 17.07.2019

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

Source_table - это таблица, структуру которой вы хотите скопировать.

person Prashant Mishra    schedule 21.04.2015

  1. создать таблицу xyz_new как select * from xyz;

- Это создаст таблицу и скопирует все данные.

  1. удалить из xyz_new;

- Структура таблицы будет такой же, но все скопированные данные будут удалены.

Если вы хотите преодолеть ограничения, указанные в ответе: Как создать копию таблицы Oracle без копирования данных?

person Jeevan Reddy Gujjula    schedule 13.08.2019

Вышеуказанную задачу можно выполнить в два простых шага.

ШАГ 1:

CREATE table new_table_name AS(Select * from old_table_name);

query выше создает дубликат таблицы (также с содержимым).

Чтобы получить структуру, удалите содержимое таблицы с помощью.

ШАГ 2:

DELETE * FROM new_table_name.

Надеюсь, это решит вашу проблему. И благодаря более ранним сообщениям. Дал мне много идей.

person Donkha    schedule 28.08.2012
comment
Это даже менее эффективно, чем версия truncate. Помимо выделения экстентов для всех данных, вы не освобождаете их путем удаления, поэтому вы потенциально тратите пространство, если таблица не вырастет до старого размера. И вы генерируете отмену / повтор как при вставке, так и при удалении. Ответ Джима очень просто избегает всего этого. - person Alex Poole; 29.08.2012