어떻게 만들 수 있습니 복사본을 Oracle 의 테이블에 데이터를 복사하지 않고?

StackOverflow https://stackoverflow.com/questions/233870

문제

나는 문이:

create table xyz_new as select * from xyz;

는 사본 구조 및 데이터,하지만 만약 내가 원하는 구조?

도움이 되었습니까?

해결책

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

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

제한

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

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

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


다른 팁

나는 당신이 많이 받아 들인 방법을 사용했지만 누군가가 지적한대로 제약 조건을 복제하지는 않습니다 (널을 제외하고는 생각합니다).

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

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 무료로 사용하는 응용 프로그램입니다.

테이블에 있는 경우 시퀀스 또는 트리거 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 등이 없습니다.

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+ IMHO의 약간 클리너 코드입니다

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 작업 공간 또는 객체 탐색기에서 Table_Name을 마우스 오른쪽 버튼으로 클릭하고 SQL 스크립트를 생성하여 모든 제약 조건과 함께 테이블을 생성하는 "SQL보기"를 클릭하는 것보다. , 인덱스, 파티션 등 ..

다음으로 New_table_name을 사용하여 스크립트를 실행합니다

다른 방식으로 아래에 나열된 명령에서 테이블 생성의 DDL을 얻고 생성을 실행할 수 있습니다.

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 

TYPE is ('TABLE','PROCEDURE', etc...)

이 명령을 사용하면 데이터베이스 개체에서 대부분의 DDL을 얻을 수 있습니다.

테이블 데이터없이 복사하십시오

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

테이블 데이터로 복사하십시오

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

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

1 단계:

CREATE table new_table_name AS(Select * from old_table_name);

그만큼 query 위는 테이블의 복제물을 만듭니다 (내용도 포함).

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

2 단계:

DELETE * FROM new_table_name.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top