Я знаю утверждение:
create table xyz_new as select * from xyz;
Что копирует структуру и данные, но что, если мне просто нужна структура?


Используя sql Developer, выберите таблицу и щелкните вкладку DDL
Вы можете использовать этот код для создания новой таблицы без данных при запуске на листе sql.
sqldeveloper - бесплатное приложение от Oracle.
Если в таблице есть последовательности или триггеры, ddl иногда генерирует их и для вас. Вам просто нужно быть осторожным в том, в каком порядке вы их размещаете, и знать, когда включать или выключать триггеры.
В Oracle SQL Developer v.18.3 вкладка называется SQL.
Просто используйте предложение where, которое не выбирает никакие строки:
create table xyz_new as select * from xyz where 1=0;
Следующие вещи не будут скопированы в новую таблицу:
Это также не обрабатывает разделы
Это отличный чистый ответ. Просто хочу напомнить, что это нет будет включать любые ограничения .. у новой таблицы даже не будет первичного ключа.
это также не будет воспроизводить последовательности или триггеры.
и у новой таблицы не будет никаких индексов - не попадитесь, пытаясь сделать большой запрос к новой таблице :-)
также не обрабатывает разделы. Но эй.
Просто дополнение - оно воля содержит ограничения немного - т.е. любые ограничения NOT NULL будут скопированы.
Подойдет для некоторых простых случаев, но для более сложных ситуаций может потребоваться много дополнительных накладных расходов. Пример при использовании табличных функций, табличная функция все еще должна быть выполнена. Могут быть и другие случаи, когда оптимизатор не может эффективно оптимизировать «1 = 0» и заставляет выполнять большие фрагменты подзапроса.
именно то, что мне нужно
Что означает where 1=0?
@Jim Я скопировал некоторые ограничения из комментариев. Я не dba, так что, возможно, ошибаюсь.
@DylanChensky 1=0 - это логическое условие, которое всегда будет оцениваться как false. YoYo говорит, что иногда оптимизатор этого не осознает (из-за окружающих выражений в «сложной ситуации») и пытается искать строки, в которых значение 1=0 истинно.
Также не копирует определения столбца DATA_DEFAULT.
@DylanCzenski это нужно только потому, что вам нужна только структура без каких-либо данных, и это выражение дает вам нулевой результат только `` заголовок ''
@JeffreyKemp ... Если мне нужно включить индекс и разделы при создании новой таблицы, что мне делать?
@VaibhavGupta, вам лучше просто получить определение таблицы (например, используя dbms_metadata или такой инструмент, как SQL Developer) и использовать его для создания вашей новой таблицы. Задокументированный здесь трюк предназначен для быстрых и неприятных копий без наворотов.
Я использовал метод, который вы часто принимали, но, как кто-то заметил, он не дублирует ограничения (за исключением 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;
Как эта команда будет изменена, если я хочу скопировать из другой схемы.
My_table_name - это существующая таблица. Но как мне получить имя созданной моей новой таблицы?
Команда в моем ответе не создает новую таблицу; он возвращает SQL, который вы использовали бы для воссоздания исходной таблицы. Вы изменяете его по своему усмотрению, а затем запускаете. Таким образом, имя новой таблицы будет любым, которое вы укажете.
Итак, это должно быть похоже на присвоение указанной выше команды sql переменной. рыть? напр. new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). А пока дайте мне знать, что здесь делает LONG.
вы также можете сделать
create table abc_new as select * from abc;
затем обрежьте таблицу abc_new. Надеюсь, этого будет достаточно.
Конечно, если у вас много данных в исходной таблице, это может быть действительно очень плохой идеей. ;)
Вышеуказанную задачу можно выполнить в два простых шага.
CREATE table new_table_name AS(Select * from old_table_name);
query выше создает дубликат таблицы (также с содержимым).
Чтобы получить структуру, удалите содержимое таблицы с помощью.
DELETE * FROM new_table_name.
Надеюсь, это решит вашу проблему. И благодаря более ранним сообщениям. Дал мне много понимания.
Это даже менее эффективно, чем версия truncate. Помимо выделения экстентов для всех данных, вы не освобождаете их путем удаления, поэтому вы потенциально тратите пространство, если таблица не вырастет до старого размера. И вы генерируете отмену / повтор как для вставки, так и для удаления. Ответ Джима очень просто избегает всего этого.
create table xyz_new as select * from xyz where rownum = -1;
Чтобы избежать повторения снова и снова и ничего не вставлять на основе условия, где 1 = 2
Просто напишите такой запрос:
create table new_table as select * from old_table where 1=2;
где new_table - это имя новой таблицы, которую вы хотите создать, а old_table - это имя существующей таблицы, структуру которой вы хотите скопировать, при этом будет скопирована только структура.
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 - это TABLE, PROCEDURE и т. д.С помощью этой команды вы можете получить большую часть ddl из объектов базы данных.
Обратите внимание, что аргументы GET_DDL чувствительны к регистру.
Ты можешь сделать это
Create table New_table as select * from Old_table where 1=2 ;но будь осторожен
Созданная вами таблица не имеет индекса, PK и т. д., Как old_table.
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 <target_table> as select * from <source_table> where 1=2;
create table <target_table> as select * from <source_table>;
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;
Создайте новую пустую таблицу, используя схему другой. Просто добавьте предложение WHERE, которое заставляет запрос не возвращать данные:
WHERE 1 = 0 или подобные ложные условия работают, но мне не нравится, как они выглядят. Незначительно более чистый код для Oracle 12c + IMHO - это
CREATE TABLE bar AS
SELECT *
FROM foo
FETCH FIRST 0 ROWS ONLY;
Применяются те же ограничения: в новую таблицу копируются только определения столбцов и их допуски к значениям NULL.
- create table xyz_new as select * from xyz;
- Это создаст таблицу и скопирует все данные.
- delete from xyz_new;
- Структура таблицы будет такой же, но все скопированные данные будут удалены.
Если вы хотите преодолеть ограничения, указанные в ответе: Как я могу создать копию таблицы Oracle без копирования данных?
Если нужно создать таблицу (с пустой структурой) только для ОБМЕННЫЙ РАЗДЕЛ, лучше всего использовать предложение «..FOR EXCHANGE ..». Однако он доступен только начиная с Версия Oracle 12,2.
CREATE TABLE t1_temp FOR EXCHANGE WITH TABLE t1;
Это беспрепятственно адресует «ORA-14097» во время «раздела обмена», если структуры таблиц точно не копируются при нормальной работе CTAS. Я видел, как Oracle пропустил некоторые определения столбцов «DEFAULT» и «HIDDEN» из исходной таблицы.
ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION
Связанный: stackoverflow.com/questions/11472519/…