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

Ответы:

420

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

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

Ограничения

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

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

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


Джим хадсон
источник
53
Это отличный, чистый ответ. Просто хочу напомнить, что это не будет включать никаких ограничений ... новая таблица даже не будет иметь первичного ключа.
JosephStyons
18
это не будет реплицировать последовательности или триггеры либо.
BranchGabriel
16
новая таблица также не будет иметь индексов - не
пытайтесь
8
также не обрабатывает разделы. Но эй.
МК.
17
Просто дополнение - оно будет содержать некоторые ограничения - т.е. любые ограничения NOT NULL будут скопированы.
Джеффри Кемп
84

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

Используя sql developer выберите таблицу и нажмите на вкладку DDL

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

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

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

branchgabriel
источник
В Oracle SQL Developer v.18.3 эта вкладка называетсяSQL
Metafaniel,
14
create table xyz_new as select * from xyz where rownum = -1;

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

sunleo
источник
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

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

Мохсен Молаи
источник
2
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

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

Угадай кто
источник
1

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

create table abc_new as select * from abc; 

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

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

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

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

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

user3284249
источник
1

WHERE 1 = 0или подобные ложные условия работают, но мне не нравится, как они выглядят. Маргинально более чистый код для Oracle 12c + ИМХО

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

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

DKroot
источник
1

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

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPEесть TABLEи PROCEDUREт. д.

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

Диого Маскио
источник
Обратите внимание, что аргументы to GET_DDLчувствительны к регистру.
Шридхар Сарнобат
0
Create table target_table 
As
Select * 
from source_table 
where 1=2;

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

Прашант Мишра
источник
0

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

Затем вы запускаете скрипт, используя имя новой_таблицы

Ярив Шейнгут
источник
0

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

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

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

create table <target_table> as select * from <source_table>;
Alok
источник
0
  1. создать таблицу xyz_new как select * from xyz;

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

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

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

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

Дживан Редди Гужула
источник
-5

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

ШАГ 1:

CREATE table new_table_name AS(Select * from old_table_name);

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

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

ШАГ 2:

DELETE * FROM new_table_name.

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

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