Як я можу створити копію таблиці Oracle без копіювання даних?


Відповіді:


420

Просто використовуйте пункт де не вибирає жодних рядків:

create table xyz_new as select * from xyz where 1=0;

Обмеження

Наступні речі не будуть скопійовані до нової таблиці:

  • послідовності
  • тригери
  • покажчики
  • деякі обмеження можуть бути скопійовані
  • журнали матеріалізованого перегляду

Це також не обробляє розділи



53
Це чудова, чиста відповідь. Просто хочу нагадати, що це не буде містити жодних обмежень. У новій таблиці навіть не буде первинного ключа.
JosephStyons

18
це також не повторить послідовності чи тригери.
branchgabriel

16
а також у новій таблиці не буде індексів - не
піймайте

8
також не обробляє розділи. Але ей.
МК.

17
Просто додаток - воно буде містити деякі обмеження - тобто будь-які обмеження NOT NULL будуть скопійовані.
Джеффрі Кемп

84

Я використовував метод, який ви багато сприйняли, але, як хтось зазначив, він не дублює обмежень (за винятком 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;

Як буде змінена ця команда, якщо я хочу скопіювати з іншої схеми.
kushalvm

My_table_nameє існуюча таблиця. Але як я можу створити назву створеної нової таблиці?
kushalvm

Команда у моїй відповіді не створює нову таблицю; він повертає SQL, який ви використовували б для відтворення вихідної таблиці. Ви змінюєте його за бажанням, а потім запускаєте. Тож назва нової таблиці - це все, що ви вирішите вказати.
Дейв Коста

5
Отже, це має бути як присвоєння вищевказаної команди sql змінній. рит? напр. new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). Тим часом, будь ласка, дайте мені знати, що LONG робить тут.
kushalvm

15

За допомогою програми sql виберіть таблицю та натисніть на вкладку DDL

Ви можете використовувати цей код для створення нової таблиці без даних, коли ви запускаєте її на робочому аркуші sql

sqldeveloper - це безкоштовне користування додатком від Oracle.

Якщо в таблиці є послідовності або тригери, DDL іноді генерує такі й для вас. Ви просто повинні бути обережними, в якому порядку ви їх вносите, і знати, коли вмикати або вимикати тригери.


В Oracle SQL Developer v.18.3 називається вкладкаSQL
Metafaniel

14
create table xyz_new as select * from xyz where rownum = -1;

Щоб уникнути повторення повторно і знову і не вставляйте нічого, виходячи з умови, коли 1 = 2


4
    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; 

3

Ви можете це зробити, Create table New_table as select * from Old_table where 1=2 ; але будьте обережні. У таблиці, яку ви створюєте, немає індексу, Pk тощо, як old_table


2
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

Створіть нову порожню таблицю за допомогою схеми іншої. Просто додайте пункт WHERE, через який запит не повертає даних:


1

ви також можете зробити

create table abc_new as select * from abc; 

потім обрізати стіл abc_new. Сподіваюсь, це буде достатньо вашої вимоги.


11
Звичайно, якщо у вас є багато даних у вихідній таблиці, це може бути дуже, дуже поганою ідеєю. ;)
Алексіос

1

Просто напишіть запит, наприклад:

create table new_table as select * from old_table where 1=2;

звідки new_tableназва нової таблиці, яку ви хочете створити, і old_tableце назва існуючої таблиці, структуру якої ви хочете скопіювати, це буде копіювати лише структуру.


1

WHERE 1 = 0чи подібні помилкові умови працюють, але мені не подобається, як вони виглядають. Дещо більш чистий код для Oracle 12c + IMHO є

CREATE TABLE bar AS SELECT * FROM foo FETCH FIRST 0 ROWS ONLY;

Застосовуються ті ж обмеження: у нову таблицю копіюються лише визначення стовпців та їх нульовість.


1

Іншим способом ви можете отримати ddl створення таблиці з наведеної нижче команди та виконати створення.

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPEє TABLEі PROCEDUREт.д.

За допомогою цієї команди ви можете отримати більшість DDL від об'єктів бази даних.


Зауважте, що аргументи GET_DDLзалежать від регістру.
Шрідхар Сарнобат

0
Create table target_table 
As
Select * 
from source_table 
where 1=2;

Source_table - це таблиця, яку ви хочете скопіювати структуру.


0

Використовуючи розробник pl / sql, ви можете клацнути правою кнопкою миші на ім'я таблиці або в робочій області sql або в провіднику об'єктів, ніж натиснути на "view", а потім натиснути "view sql", що генерує скрипт sql для створення таблиці разом з усіма обмеженнями. , індекси, розділи тощо.

Далі ви запускаєте сценарій, використовуючи ім'я new_table_name


0

копіювати без даних таблиці

create table <target_table> as select * from <source_table> where 1=2;

копіювати з табличними даними

create table <target_table> as select * from <source_table>;

0
  1. створити таблицю xyz_new як select * від xyz;

- Це створить таблицю і скопіює всі дані.

  1. видалити з xyz_new;

- Це буде однакова структура таблиці, але всі скопійовані дані будуть видалені.

Якщо ви хочете подолати обмеження, визначені відповіддю: Як я можу створити копію таблиці Oracle без копіювання даних?


-5

Наведене вище завдання можна виконати в два простих етапи.

КРОК 1:

CREATE table new_table_name AS(Select * from old_table_name);

queryВище створює дублікат таблиці (з вмістом, а).

Щоб отримати структуру, видаліть вміст таблиці за допомогою.

КРОК 2:

DELETE * FROM new_table_name.

Сподіваюся, це вирішить вашу проблему. І завдяки попереднім постам. Дав мені багато розуміння.


13
Це навіть менш ефективно, ніж truncateверсія. Окрім виділення розширень для всіх даних, ви не звільняєте їх, видаляючи, тому ви потенційно витрачаєте місце, якщо таблиця не виросте до старого розміру. І ви генеруєте скасувати / повторити і вставку, і видалення. Відповідь Джима дуже просто уникає всього цього.
Алекс Пул
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.