데이터를 복사하지 않고 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를 사용하여 이 작업을 수행할 수도 있지만, 지금은 훨씬 쉬워졌습니다.)
Edited to add 원하는 테이블이 다른 스키마에 있는 경우:
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
create table xyz_new as select * from xyz where rownum = -1;
반복을 방지하고 1=2인 조건에 따라 아무 것도 삽입하지 않음
sql developer를 사용하여 테이블을 선택하고 DDL 탭을 클릭합니다.
이 코드를 사용하여 SQL 워크시트에서 테이블을 실행할 때 데이터 없이 새 테이블을 생성할 수 있습니다.
sqldeveloper는 Oracle의 앱을 무료로 사용할 수 있습니다.
테이블에 시퀀스 또는 트리거가 있는 경우 ddl이 해당 시퀀스 또는 트리거를 생성할 수도 있습니다.어떤 순서로 만들었는지 주의하고 언제 트리거를 켜거나 끌지 알아야 합니다.
하면 요.Create table New_table as select * from Old_table where 1=2 ; 그러나 주의: 작성하는 테이블에는 old_table과 같은 Index, PK 등이 없습니다.
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;
서 ''는new_table입니다.또, 「이러한 테이블」은, 「이러한 테이블」입니다.old_table는 구조를 복사할 기존 테이블의 이름입니다.이 경우 구조만 복사됩니다.
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;
다른 스키마를 사용하여 빈 테이블을 새로 만듭니다.쿼리가 데이터를 반환하지 않도록 하는 WHERE 절을 추가합니다.
WHERE 1 = 0혹은 비슷한 거짓 조건들이 효과가 있지만, 나는 그들이 보이는 것이 싫다. isOracle 12c+IMHO의 더 정리했습니다.
CREATE TABLE bar AS SELECT * FROM foo FETCH FIRST 0 ROWS ONLY;
동일한 제한이 적용됩니다. 열 정의와 그 무효만 새 테이블에 복사됩니다.
EXCHANGE PARTION만을 위해 (빈 구조의) 테이블을 작성해야 하는 경우 ".."를 사용하는 것이 가장 좋습니다.FOR EXCHANGE.." 조항.그러나 Oracle 버전 12.2 이후에서만 사용할 수 있습니다.
CREATE TABLE t1_temp FOR EXCHANGE WITH TABLE t1;
이것은, 통상적인 CTAS 동작에 의해서 테이블 구조가 정확하게 카피되지 않는 경우, 「Exchange Partition(교환 파티션)」중에 「ORA-14097」에 심리스하게 됩니다.Oracle이 원본 테이블에서 "DEFAULT" 열과 "HIDDEND" 열 정의를 일부 누락한 것을 보았습니다.
ORA-14097: ALTER TABLE EXCHANGE 파티션의 열 유형 또는 크기 불일치
또 다른 방법으로
create table abc_new as select * from abc;
그런 다음 테이블을 잘라냅니다.abc_new이것으로 충분하시기를 바랍니다.
pl/sql developer를 사용하면 sql 워크스페이스 또는 오브젝트 탐색기에서 table_name을 오른쪽 클릭하여 "view"를 클릭하고 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>;
다른 방법으로 아래 나열된 명령에서 테이블 작성의 ddl을 가져와 작성을 실행할 수 있습니다.
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
TYPE이TABLE,PROCEDURE기타.
이 명령어를 사용하면 대부분의 ddl을 데이터베이스 개체에서 가져올 수 있습니다.
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table은 구조를 복사하는 테이블입니다.
- xyz에서 *를 선택하여 xyz_new 테이블을 만듭니다.
--테이블이생성되고모든데이터가복사됩니다.
- xyz_new에서 삭제합니다.
-- 테이블 구조는 같지만 복사된 데이터는 모두 삭제됩니다.
답변에 의해 지정된 제한을 극복하려면 다음 절차를 따릅니다.데이터를 복사하지 않고 Oracle 테이블의 복사본을 만들려면 어떻게 해야 합니까?
위의 작업은 두 가지 간단한 단계로 완료할 수 있습니다.
순서 1:
CREATE table new_table_name AS(Select * from old_table_name);
그query위의 명령어는 (내용도 포함) 테이블의 복제를 만듭니다.
구조를 가져오려면 를 사용하여 표의 내용을 삭제합니다.
순서 2:
DELETE * FROM new_table_name.
이것으로 당신의 문제가 해결되길 바랍니다.그리고 아까 올린 글들 덕분에많은 통찰력을 얻었죠
언급URL : https://stackoverflow.com/questions/233870/how-can-i-create-a-copy-of-an-oracle-table-without-copying-the-data
'programing' 카테고리의 다른 글
| JSON 문자열을 사전으로 역직렬화 (0) | 2023.03.15 |
|---|---|
| 배송 메서드를 가져오는 동안 Woocommerce가 빈 어레이 목록을 반환하는 중 (0) | 2023.03.15 |
| UI 라우터 해결 함수의 처리 오류입니까?(일명 $state)ChangeError) 데이터를 오류 상태로 전달하시겠습니까? (0) | 2023.03.15 |
| 봄 프로젝트 실가동 코드용 RestTemplate vs Apache Http Client (0) | 2023.03.15 |
| AngularJS : ng클릭으로 변수값을 설정할 수 없습니까? (0) | 2023.03.15 |