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

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

create table xyz_new as select * from xyz;

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

Ответы [ 15 ]

399 голосов
/ 24 октября 2008

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

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

Ограничения

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

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

Это также не относится к разделам


83 голосов
/ 27 октября 2008

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

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

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

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

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

14 голосов
/ 21 декабря 2013
create table xyz_new as select * from xyz where rownum = -1;

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

4 голосов
/ 05 декабря 2016
    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 голосов
/ 11 декабря 2015

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

2 голосов
/ 01 сентября 2017
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

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

1 голос
/ 16 февраля 2018

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

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

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

1 голос
/ 07 февраля 2014

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

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

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

0 голосов
/ 16 апреля 2017

копия без данных таблицы

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

копия с данными таблицы

create table <target_table> as select * from <source_table>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...