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

214

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

create table xyz_new as select * from xyz;

Который копирует структуру и данные, но что, если я просто хочу структуру?

Теги:
copy
database-table

15 ответов

335
Лучший ответ

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

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

Ограничения

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

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

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


  • 1
    просто и сделал свое дело - спасибо: о)
  • 51
    Это отличный, чистый ответ. Просто хочу напомнить, что это не будет включать никаких ограничений ... новая таблица даже не будет иметь первичного ключа.
Показать ещё 12 комментариев
74

Я использовал метод, который вы приняли много, но, как заметил кто-то, он не дублирует ограничений (за исключением 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;
  • 0
    Как эта команда будет изменена, если я хочу скопировать из другой схемы.
  • 0
    My_table_name - это существующая таблица. Но как мне получить имя моей новой созданной таблицы?
Показать ещё 2 комментария
13

С помощью разработчика sql выберите таблицу и нажмите вкладку DDL

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

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

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

  • 0
    В Oracle SQL Developer v.18.3 вкладка называется SQL
9
create table xyz_new as select * from xyz where rownum = -1;

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

3

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

1
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

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

1
    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; 
1

Используйте атрибуты WITH DATA или NO DATA:

пример:

CREATE TABLE db.tablename_now AS db.tablename_previous WITH DATA; 

источник: http://forgetcode.com/Teradata/1209-COPY-TABLE-STRUCTURE-and-DATA

1

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

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

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

0

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

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

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

create table <target_table> as select * from <source_table>;
0

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

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 

TYPE is ('TABLE','PROCEDURE', etc...)

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

0

С помощью pl/sql-разработчика вы можете щелкнуть правой кнопкой мыши по имени таблицы либо в рабочей области sql, либо в проводнике объектов, а затем щелкнуть мышью на "view" и щелкнуть "view sql", который генерирует sql script для создания таблицы наряду со всеми ограничениями, индексами, разделами и т.д.

Затем вы запустите script с помощью new_table_name

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

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

0

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

create table abc_new as select * from abc; 

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

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

Задача выше может быть выполнена двумя простыми шагами.

ШАГ 1:

CREATE table new_table_name AS(Select * from old_table_name);

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

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

ШАГ 2:

DELETE * FROM new_table_name.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню