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

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

create table xyz_new as select * from xyz;

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

Связанный: stackoverflow.com/questions/11472519/…

AlikElzin-kilaka 09.07.2015 13:37
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
284
1
600 418
17
Перейти к ответу Данный вопрос помечен как решенный

Ответы 17

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

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

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

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

В Oracle SQL Developer v.18.3 вкладка называется SQL.

Metafaniel 22.01.2019 18:07
Ответ принят как подходящий

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

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

Ограничения

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

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

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


Это отличный чистый ответ. Просто хочу напомнить, что это нет будет включать любые ограничения .. у новой таблицы даже не будет первичного ключа.

JosephStyons 24.10.2008 19:02

это также не будет воспроизводить последовательности или триггеры.

branchgabriel 24.10.2008 21:29

и у новой таблицы не будет никаких индексов - не попадитесь, пытаясь сделать большой запрос к новой таблице :-)

hamishmcn 01.11.2008 21:09

также не обрабатывает разделы. Но эй.

MK. 20.10.2011 18:38

Просто дополнение - оно воля содержит ограничения немного - т.е. любые ограничения NOT NULL будут скопированы.

Jeffrey Kemp 29.08.2012 04:36

Подойдет для некоторых простых случаев, но для более сложных ситуаций может потребоваться много дополнительных накладных расходов. Пример при использовании табличных функций, табличная функция все еще должна быть выполнена. Могут быть и другие случаи, когда оптимизатор не может эффективно оптимизировать «1 = 0» и заставляет выполнять большие фрагменты подзапроса.

YoYo 09.04.2015 21:33

именно то, что мне нужно

Pieter De Bie 19.08.2015 15:44

Что означает where 1=0?

Dylan Czenski 12.01.2016 17:14

@Jim Я скопировал некоторые ограничения из комментариев. Я не dba, так что, возможно, ошибаюсь.

jpaugh 24.10.2016 19:43

@DylanChensky 1=0 - это логическое условие, которое всегда будет оцениваться как false. YoYo говорит, что иногда оптимизатор этого не осознает (из-за окружающих выражений в «сложной ситуации») и пытается искать строки, в которых значение 1=0 истинно.

jpaugh 24.10.2016 19:46

Также не копирует определения столбца DATA_DEFAULT.

user909481 22.11.2017 11:50

@DylanCzenski это нужно только потому, что вам нужна только структура без каких-либо данных, и это выражение дает вам нулевой результат только `` заголовок ''

SüniÚr 17.07.2018 15:17

@JeffreyKemp ... Если мне нужно включить индекс и разделы при создании новой таблицы, что мне делать?

Vaibhav Gupta 06.04.2020 13:29

@VaibhavGupta, вам лучше просто получить определение таблицы (например, используя dbms_metadata или такой инструмент, как SQL Developer) и использовать его для создания вашей новой таблицы. Задокументированный здесь трюк предназначен для быстрых и неприятных копий без наворотов.

Jeffrey Kemp 06.04.2020 17:55

Я использовал метод, который вы часто принимали, но, как кто-то заметил, он не дублирует ограничения (за исключением 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;

Как эта команда будет изменена, если я хочу скопировать из другой схемы.

HalfWebDev 15.07.2013 13:53
My_table_name - это существующая таблица. Но как мне получить имя созданной моей новой таблицы?
HalfWebDev 18.07.2013 15:44

Команда в моем ответе не создает новую таблицу; он возвращает SQL, который вы использовали бы для воссоздания исходной таблицы. Вы изменяете его по своему усмотрению, а затем запускаете. Таким образом, имя новой таблицы будет любым, которое вы укажете.

Dave Costa 18.07.2013 19:50

Итак, это должно быть похоже на присвоение указанной выше команды sql переменной. рыть? напр. new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). А пока дайте мне знать, что здесь делает LONG.

HalfWebDev 18.07.2013 20:26

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

create table abc_new as select * from abc; 

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

Конечно, если у вас много данных в исходной таблице, это может быть действительно очень плохой идеей. ;)

Alexios 10.10.2013 19:28

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

ШАГ 1:

CREATE table new_table_name AS(Select * from old_table_name);

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

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

ШАГ 2:

DELETE * FROM new_table_name.

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

Это даже менее эффективно, чем версия truncate. Помимо выделения экстентов для всех данных, вы не освобождаете их путем удаления, поэтому вы потенциально тратите пространство, если таблица не вырастет до старого размера. И вы генерируете отмену / повтор как для вставки, так и для удаления. Ответ Джима очень просто избегает всего этого.

Alex Poole 29.08.2012 11:05
create table xyz_new as select * from xyz where rownum = -1;

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

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

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

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

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

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

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

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

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

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPE - это TABLE, PROCEDURE и т. д.

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

Обратите внимание, что аргументы GET_DDL чувствительны к регистру.

Sridhar Sarnobat 17.07.2019 19:55

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

    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 <target_table> as select * from <source_table> where 1=2;

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

create table <target_table> as select * from <source_table>;
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

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

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

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

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

  1. create table xyz_new as select * from xyz;

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

  1. delete from xyz_new;

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

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

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

CREATE TABLE t1_temp FOR EXCHANGE WITH TABLE t1;

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

ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION

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

Другие вопросы по теме