Как я могу создать копию таблицы Oracle, не копируя данные?
-
04-07-2019 - |
Вопрос
Я знаю утверждение:
create table xyz_new as select * from xyz;
Который копирует структуру и данные, но что, если мне нужна просто структура?
Решение
Просто используйте предложение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;
Это даст вам полный текст оператора создания, который вы можете изменить по своему желанию для создания новой таблицы. Вам, конечно, придется изменить названия таблицы и все ограничения.
(Вы также можете сделать это в более старых версиях, используя EXP / IMP, но теперь это намного проще.)
Отредактировано для добавления Если нужная таблица находится в другой схеме:
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
С помощью разработчика sql выберите таблицу и щелкните вкладку 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;
Вы можете сделать это <Код> Создать таблицу New_table как выберите * из Old_table, где 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 + ИМХО это
<код> CREATE TABLE bar AS ВЫБРАТЬ * ОТ ФУ 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, вы можете щелкнуть правой кнопкой мыши имя_таблицы в рабочем пространстве sql или в проводнике объектов, а затем щелкнуть " просмотреть " и затем нажмите «просмотреть sql»; который создает сценарий sql для создания таблицы вместе со всеми ограничениями, индексами, разделами и т. д.
Затем вы запустите сценарий, используя имя новой_таблицы
Другим способом вы можете получить 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);
Приведенный выше query
создает дубликат таблицы (также с содержимым).
Чтобы получить структуру, удалите содержимое таблицы с помощью.
ШАГ 2:
DELETE * FROM new_table_name.
Надеюсь, это решит вашу проблему. И спасибо за предыдущие посты. Дали мне много понимания.