Как создать копию таблицы Oracle без копирования данных?
Я знаю заявлении:
create table xyz_new as select * from xyz;
, который копирует структуру и данные, но что если я просто хочу структурой?
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 таблица U хочу копировать структуру.
используя 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);
на query
выше создает дубликат таблицы (с содержимым также).
чтобы получить структуру, удалите содержимое таблицы с помощью.
Шаг 2:
DELETE * FROM new_table_name.
надеюсь, что это решит вашу проблему. И благодаря более ранним сообщениям. Дал мне много понимания.