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



Я знаю заявлении:



create table xyz_new as select * from xyz;


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

1114   15  

15 ответов:

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

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;

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

(вы также можете сделать это в более старые версии используют EXP / IMP, но теперь это намного проще.)

редактировать, чтобы добавить Если таблица, которую вы ищете, находится в другой схеме:

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;

с помощью SQL developer выберите таблицу и нажмите на вкладку DDL

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

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

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

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

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

    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;

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

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

create table abc_new as select * from abc; 

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

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 is ('TABLE','PROCEDURE', etc...)

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

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

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

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

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

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

Шаг 1:

CREATE table new_table_name AS(Select * from old_table_name);

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

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

Шаг 2:

DELETE * FROM new_table_name.

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

Comments

    Ничего не найдено.