데이터를 복사하지 않고 Oracle 테이블의 복사본을 만들려면 어떻게해야합니까?


답변:


420

행을 선택하지 않는 where 절을 사용하십시오.

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

한계

다음 사항은 새 테이블에 복사되지 않습니다.

  • 시퀀스
  • 트리거
  • 인덱스
  • 일부 제약 조건은 복사되지 않을 수 있습니다
  • 구체화 된 뷰 로그

이것은 또한 파티션을 처리하지 않습니다



53
이것은 훌륭하고 깨끗한 답변입니다. 여기에는 제약 조건 이 포함 되지 않습니다 . 새 테이블에는 기본 키도 없습니다.
JosephStyons

18
이것은 시퀀스 나 트리거를 복제하지 않습니다.
branchgabriel

16
도 새 테이블은 인덱스가됩니다 - 새 테이블 :-)에 큰 쿼리를 수행하려고 밖으로 잡히지 않는다
hamishmcn

8
또한 파티션을 처리하지 않습니다. 하지만 이봐
MK.

17
부록 – 일부 제약 조건 포함합니다. 즉, NOT NULL 제약 조건이 복사됩니다.
Jeffrey Kemp

84

나는 당신이 많이 받아 들인 방법을 사용했지만 누군가 지적한 것처럼 제약 조건을 복제하지 않습니다 (NOT NULL 제외).

전체 구조를 복제하려는 경우 고급 방법은 다음과 같습니다.

SET LONG 5000
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME' ) FROM DUAL;

그러면 새 테이블을 만들 때 원하는대로 수정할 수있는 전체 create 문 텍스트가 제공됩니다. 테이블 이름과 모든 제약 조건을 변경해야합니다.

(EXP / IMP를 사용하여 이전 버전에서도이 작업을 수행 할 수 있지만 훨씬 쉬워졌습니다.)

추가하기 위해 편집 한 테이블 뒤에 다른 스키마가있는 경우 :

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;

다른 스키마에서 복사하려면이 명령을 어떻게 수정해야합니까?
kushalvm

My_table_name기존 테이블입니다. 그러나 새 테이블 이름을 어떻게 만들 수 있습니까?
kushalvm

내 대답의 명령은 새 테이블을 만들지 않습니다. 원래 테이블을 재 작성하는 데 사용할 SQL을 리턴합니다. 원하는대로 수정 한 다음 실행하십시오. 따라서 새 테이블의 이름은 사용자가 지정하도록 선택한 것입니다.
Dave Costa

5
따라서 위의 sql 명령을 변수에 할당하는 것과 같아야합니다. ?? 예. new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). 한편 LONG이 여기서 무엇을하는지 알려주십시오.
kushalvm

15

SQL Developer를 사용하여 테이블을 선택하고 DDL 탭을 클릭하십시오.

이 코드를 사용하여 SQL 워크 시트에서 실행할 때 데이터가없는 새 테이블을 만들 수 있습니다

sqldeveloper는 oracle의 무료 앱입니다.

테이블에 시퀀스 또는 트리거가있는 경우 ddl은 때때로 해당 시퀀스 또는 트리거도 생성합니다. 어떤 순서로 정렬해야하는지, 트리거를 언제 켜거나 끄는 지 알아야합니다.


오라클 SQL 개발자 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 ; 있지만주의하십시오 . 생성하는 테이블에는 old_table과 같이 Index, Pk 등이 없습니다.


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

다른 스키마를 사용하여 빈 테이블을 새로 만듭니다. 쿼리가 데이터를 반환하지 않도록하는 WHERE 절을 추가하십시오.


1

당신은 또한 할 수 있습니다

create table abc_new as select * from abc; 

그런 다음 테이블을 자릅니다 abc_new. 이것이 귀하의 요구 사항으로 충분하기를 바랍니다.


11
물론 원래 테이블에 많은 데이터가 있다면 이것은 정말 나쁜 생각 일 수 있습니다. ;)
Alexios

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;

동일한 제한 사항이 적용됩니다. 열 정의와 해당 Null 허용 여부 만 새 테이블에 복사됩니다.


1

다른 방법으로 아래 나열된 명령에서 테이블 생성 ddl을 가져 와서 생성을 실행할 수 있습니다.

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPETABLE, PROCEDURE등등

이 명령을 사용하면 데이터베이스 오브젝트에서 대부분의 ddl을 얻을 수 있습니다.


인수 GET_DDL는 대소 문자를 구분합니다.
Sridhar Sarnobat

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

Source_table은 구조를 복사하려는 테이블입니다.


0

pl / sql 개발자를 사용하면 SQL 작업 영역이나 객체 탐색기에서 table_name을 마우스 오른쪽 버튼으로 클릭하고 "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>;


-5

위의 작업은 두 가지 간단한 단계로 완료 할 수 있습니다.

1 단계:

CREATE table new_table_name AS(Select * from old_table_name);

query위의 (내용뿐만 아니라) 테이블의 중복을 만듭니다.

구조를 얻으려면을 사용하여 테이블의 내용을 삭제하십시오.

2 단계:

DELETE * FROM new_table_name.

이것이 문제를 해결하기를 바랍니다. 그리고 이전 게시물 덕분에. 많은 통찰력을주었습니다.


13
이것은 truncate버전 보다 훨씬 덜 효율적 입니다. 모든 데이터에 대한 범위를 할당 할뿐만 아니라 삭제하여이를 해제하지 않으므로 테이블이 이전 크기로 커지지 않으면 공간이 낭비 될 수 있습니다. 그리고 삽입과 삭제 모두에서 실행 취소 / 다시 실행을 생성하고 있습니다. Jim의 답변은 그 모든 것을 피합니다.
Alex Poole
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.