데이터를 복사하지 않고 Oracle 테이블의 복사본을 만들려면 어떻게해야합니까?
나는 진술을 알고있다 :
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;
그러면 새 테이블을 만들 때 원하는대로 수정할 수있는 전체 create 문 텍스트가 제공됩니다. 테이블 이름과 모든 제약 조건을 변경해야합니다.
(EXP / IMP를 사용하여 이전 버전에서도이 작업을 수행 할 수 있지만 훨씬 쉬워졌습니다.)
추가하기 위해 편집했습니다 . 테이블이 다른 스키마에있는 경우 :
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
SQL Developer를 사용하여 테이블을 선택하고 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 ;
있지만주의 해야합니다. 복용량을 생성하는 테이블에는 old_table과 같이 Index, 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;
동일한 제한 사항이 적용됩니다. 열 정의와 해당 Null 허용 여부 만 새 테이블에 복사됩니다.
다른 방법으로 아래 나열된 명령에서 테이블 생성 ddl을 가져 와서 생성을 실행할 수 있습니다.
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
TYPE
인TABLE
,PROCEDURE
등등
이 명령을 사용하면 데이터베이스 오브젝트에서 대부분의 ddl을 얻을 수 있습니다.
당신은 또한 할 수 있습니다
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을 마우스 오른쪽 버튼으로 클릭하고 "view"를 클릭하고 "view sql"을 클릭하여 sql 스크립트를 생성하여 모든 제약 조건과 함께 테이블을 생성 할 수 있습니다 , 인덱스, 파티션 등
다음으로 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 테이블의 복사본을 어떻게 만들 수 있습니까?
위의 작업은 두 가지 간단한 단계로 완료 할 수 있습니다.
1 단계:
CREATE table new_table_name AS(Select * from old_table_name);
는 query
위의 (내용뿐만 아니라) 테이블의 중복을 만듭니다.
구조를 얻으려면을 사용하여 테이블의 내용을 삭제하십시오.
2 단계:
DELETE * FROM new_table_name.
이것이 문제를 해결하기를 바랍니다. 그리고 이전 게시물 덕분에. 많은 통찰력을주었습니다.
'IT' 카테고리의 다른 글
C #에서 필드를 '읽기 전용'으로 표시하면 어떤 이점이 있습니까? (0) | 2020.03.29 |
---|---|
스칼라에서 루프를 끊으려면 어떻게해야합니까? (0) | 2020.03.29 |
Sublime Text 3의 80 자 / 오른쪽 여백 줄 (0) | 2020.03.29 |
표 셀의 텍스트가 줄 바꿈되지 않도록하는 방법 (0) | 2020.03.29 |
엔터티 프레임 워크에서 1 : 1 관계에서 연결의 주요 끝은 무엇을 의미합니까? (0) | 2020.03.29 |