Ответы:
Просто используйте предложение 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;
My_table_name
это существующая таблица. Но как мне получить имя моей новой созданной таблицы?
new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ).
А пока, пожалуйста, дайте мне знать, что LONG делает здесь.
Используя sql developer выберите таблицу и нажмите на вкладку DDL
Вы можете использовать этот код для создания новой таблицы без данных при запуске ее на листе SQL
sqldeveloper - бесплатное приложение от оракула.
Если в таблице есть последовательности или триггеры, ddl иногда будет генерировать их и для вас. Вам просто нужно быть осторожным, в каком порядке вы их делаете, и знать, когда включать или выключать триггеры.
SQL
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 + ИМХО
CREATE TABLE bar AS
SELECT *
FROM foo
FETCH FIRST 0 ROWS ONLY;
Применяются те же ограничения: только определения столбцов и их обнуляемость копируются в новую таблицу.
Другим способом вы можете получить ddl создания таблицы из команды, указанной ниже, и выполнить создание.
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
TYPE
есть TABLE
и PROCEDURE
т. д.С помощью этой команды вы можете получить большинство ddl из объектов базы данных.
GET_DDL
чувствительны к регистру.
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table - это таблица, в которую вы хотите скопировать структуру.
Используя pl / sql developer, вы можете щелкнуть правой кнопкой мыши имя таблицы в рабочей области sql или в проводнике объектов, затем щелкнуть «view» и затем щелкнуть «view sql», который генерирует скрипт sql для создания таблицы вместе со всеми ограничениями. , индексы, разделы и т.д ..
Затем вы запускаете скрипт, используя имя новой_таблицы
- создать таблицу 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
версия. Помимо выделения экстентов для всех данных, вы не освобождаете их, удаляя, поэтому вы можете тратить пространство впустую, пока таблица не увеличится до старого размера. И вы генерируете отмену / повтор как при вставке, так и при удалении. Ответ Джима очень просто избегает всего этого.