Я знаю утверждение:
create table xyz_new as select * from xyz;
Что копирует структуру и данные, но что, если мне просто нужна структура?
Я знаю утверждение:
create table xyz_new as select * from xyz;
Что копирует структуру и данные, но что, если мне просто нужна структура?
Просто используйте предложение where, которое не выбирает никакие строки:
create table xyz_new as select * from xyz where 1=0;
Следующие вещи не будут скопированы в новую таблицу:
Это также не обрабатывает разделы
where 1=0
?
- person Dylan Czenski; 12.01.2016
1=0
- это логическое условие, которое всегда будет оцениваться как false
. YoYo говорит, что иногда оптимизатор этого не понимает (из-за окружающих выражений в сложной ситуации) и пытается искать строки, в которых 1=0
истинно.
- person jpaugh; 24.10.2016
DATA_DEFAULT
столбца.
- person user909481; 22.11.2017
Я использовал метод, который вы часто принимали, но, как кто-то заметил, он не дублирует ограничения (за исключением 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
- существующая таблица. Но как мне получить имя моей новой созданной таблицы?
- person HalfWebDev; 18.07.2013
new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ).
А пока дайте мне знать, что здесь делает LONG.
- person HalfWebDev; 18.07.2013
Используя sql Developer, выберите таблицу и щелкните вкладку DDL
Вы можете использовать этот код для создания новой таблицы без данных при запуске на листе sql.
sqldeveloper - бесплатное приложение от Oracle.
Если в таблице есть последовательности или триггеры, ddl иногда генерирует их и для вас. Вам просто нужно быть осторожным в том, в каком порядке вы их размещаете, и знать, когда включать или выключать триггеры.
SQL
- person Metafaniel; 22.01.2019
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 ;
но будьте осторожны. Созданная вами таблица не имеет индекса, PK и т. Д., Как old_table.
Просто напишите такой запрос:
create table new_table as select * from old_table where 1=2;
где new_table
- имя новой таблицы, которую вы хотите создать, а old_table
- имя существующей таблицы, структуру которой вы хотите скопировать, при этом будет скопирована только структура.
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;
Создайте новую пустую таблицу, используя схему другой. Просто добавьте предложение WHERE, которое заставляет запрос не возвращать данные:
Если нужно создать таблицу (с пустой структурой) только для ОБМЕНА РАЗДЕЛОМ, лучше всего использовать предложение ..FOR EXCHANGE ... Однако он доступен только начиная с версии Oracle 12.2.
CREATE TABLE t1_temp FOR EXCHANGE WITH TABLE t1;
Это беспрепятственно адресует «ORA-14097» во время «раздела обмена», если структуры таблиц точно не копируются при нормальной работе CTAS. Я видел, как Oracle не хватает некоторых определений столбца DEFAULT и HIDDEN из исходной таблицы.
ORA-14097: несоответствие типа или размера столбца в ALTER TABLE EXCHANGE PARTITION
См. Это для дальнейшего чтения ...
вы также можете сделать
create table abc_new as select * from abc;
затем обрежьте таблицу abc_new
. Надеюсь, этого будет достаточно.
Используя pl / sql developer, вы можете щелкнуть правой кнопкой мыши имя_таблицы либо в рабочей области sql, либо в проводнике объектов, затем щелкнуть «view» и затем щелкнуть «view sql», который генерирует sql-скрипт для создания таблицы со всеми ограничениями. , индексы, разделы и т. д.
Затем вы запускаете скрипт, используя new_table_name
create table <target_table> as select * from <source_table> where 1=2;
create table <target_table> as select * from <source_table>;
WHERE 1 = 0
или похожие ложные условия работают, но мне не нравится, как они выглядят. Незначительно более чистый код для Oracle 12c + IMHO - это
CREATE TABLE bar AS
SELECT *
FROM foo
FETCH FIRST 0 ROWS ONLY;
Применяются те же ограничения: в новую таблицу копируются только определения столбцов и их допустимость значений NULL.
Другим способом вы можете получить ddl создания таблицы из команды, указанной ниже, и выполнить создание.
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
TYPE
равно _3 _, _ 4_ и т. Д.С помощью этой команды вы можете получить большую часть ddl из объектов базы данных.
GET_DDL
чувствительны к регистру.
- person Sridhar Sarnobat; 17.07.2019
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table - это таблица, структуру которой вы хотите скопировать.
- создать таблицу xyz_new как select * from xyz;
- Это создаст таблицу и скопирует все данные.
- удалить из xyz_new;
- Структура таблицы будет такой же, но все скопированные данные будут удалены.
Если вы хотите преодолеть ограничения, указанные в ответе: Как создать копию таблицы Oracle без копирования данных?
Вышеуказанную задачу можно выполнить в два простых шага.
CREATE table new_table_name AS(Select * from old_table_name);
query
выше создает дубликат таблицы (также с содержимым).
Чтобы получить структуру, удалите содержимое таблицы с помощью.
DELETE * FROM new_table_name.
Надеюсь, это решит вашу проблему. И благодаря более ранним сообщениям. Дал мне много идей.
truncate
. Помимо выделения экстентов для всех данных, вы не освобождаете их путем удаления, поэтому вы потенциально тратите пространство, если таблица не вырастет до старого размера. И вы генерируете отмену / повтор как при вставке, так и при удалении. Ответ Джима очень просто избегает всего этого.
- person Alex Poole; 29.08.2012