Я знаю утверждение:
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;
В новую таблицу не будут скопированы следующие вещи:
Это также не обрабатывает разделы
Я использовал метод, который вы приняли много, но, как заметил кто-то, он не дублирует ограничений (за исключением 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;
Вы можете сделать это
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
- это имя существующей таблицы, структура которой вы хотите скопировать, она будет копировать только структуру.
Используйте атрибуты WITH DATA
или NO DATA
:
пример:
CREATE TABLE db.tablename_now AS db.tablename_previous WITH DATA;
источник: http://forgetcode.com/Teradata/1209-COPY-TABLE-STRUCTURE-and-DATA
Другим способом вы можете получить ddl создания таблицы из команды, указанной ниже, и выполнить создание.
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
TYPE
TABLE
, PROCEDURE
и т.д.С помощью этой команды вы можете получить большинство ddl из объектов базы данных.
WHERE 1 = 0
или аналогичные ложные условия работают, но мне не нравится, как они выглядят. Маргинально более чистый код для Oracle 12c+ ИМХО
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 - это таблица, в которой вы хотите скопировать структуру.
С помощью pl/sql-разработчика вы можете щелкнуть правой кнопкой мыши по имени таблицы либо в рабочей области sql, либо в проводнике объектов, а затем щелкнуть мышью на "view" и щелкнуть "view sql", который генерирует sql script для создания таблицы наряду со всеми ограничениями, индексами, разделами и т.д.
Затем вы запустите script с помощью new_table_name
create table <target_table> as select * from <source_table> where 1=2;
create table <target_table> as select * from <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.
Надеюсь, это решает вашу проблему. И благодаря более ранним сообщениям. Дал мне много понимания.