테이블 구조를 새 테이블로 복사


91

모든 키와 제약 조건을 포함하여 데이터없이 테이블 구조를 새 테이블로 복사하는 방법이 있습니까?

답변:


106

간단한 스키마 복사의 경우 like 절을 사용하십시오.

CREATE TABLE new_table_name ( like old_table_name including all)

13
다음과 같은 구문을 사용할 때 새 열을 추가 할 수도 있습니다.CREATE TABLE new (like old, extra_column text);
Brad Koch

@BradKoch이 문 내에 추가 제약 조건을 추가 할 수 있습니까? 아니면 별도의 것이어야합니까?
Andrey Deineko

@AndreyDeineko 상황에 따라 자세한 내용은 테이블 생성 문서 를 확인 하십시오. 다른 create 문과 마찬가지로이 구문을 사용하여 검사 및 외래 키 제약 조건을 쉽게 추가 할 수 있지만 null이 아닌 것과 같은 열 수준 제약 조건이 후속 변경없이 적용될 수 있는지 여부는 확실하지 않습니다.
Brad Koch

2
방금 시도했습니다. 외래 키 제약 조건 및 트리거를 복사하지 않았습니다 (PostgreSQL 9.2).
Jānis Elmeris

73

음, SQL로 얻을 수있는 가장 가까운 것은 다음과 같습니다.

create table new (
    like old
    including defaults
    including constraints
    including indexes
);

그러나 모든 것을 복사하지는 않습니다. 누락 된 가장 중요한 것은 FOREIGN KEY입니다. 또한-트리거도 복사되지 않습니다. 다른 것들에 대해서는 확실하지 않습니다.

또 다른 방법은 테이블 구조를 덤프하고 덤프에서 이름을 변경 한 다음 다시로드하는 것입니다.

pg_dump -s -t old databases | sed 's/old/new/g' | psql

그러나 이러한 단순한 sed는 다른 위치에서도 이전 버전으로 변경된다는 점에 유의하십시오 (예를 들어 "is_scolded"라는 테이블 열에있는 경우 "is_scnewed"가 됨).

질문은 오히려 이것이 왜 필요한가요? 다양한 목적을 위해 다른 기술을 사용하기 때문입니다.


참고 : including constraintsPostgreSQL의 8.3에서 작동하지 않습니다
Ragnar123

1
Postgres 9.3에서 매력처럼 작동했습니다. :)
Ganapathy

14
최고의 답변입니다. "serial"값이나 시퀀스를 기본값으로하는 다른 열이있는 경우 이전 테이블과 동일한 시퀀스를 사용하게됩니다. 따라서 두 테이블 중 하나에 항목을 삽입하면 둘 다에 대해 증가합니다.
sudo는

19

테이블을 완전히 복사하려면 TABLE 명령을 사용하는 짧은 형식을 사용할 수도 있습니다.

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

자세한 내용은 여기


불행하게도이 데이터를 복사뿐만 아니라 - 내가 이해 질문은 스키마 복사에 관한에서
재스민

🙁 ID는 새 테이블에서 NULL이며 기본값을 복사하지 않습니다.
일한

10

pgAdmin을 살펴보십시오 -원하는 작업을 수행하는 가장 쉬운 방법입니다.
테이블, Scripts-Create를 마우스 오른쪽 버튼으로 클릭합니다.


phpPgAdmin에만 액세스 할 수 있습니다. 나는 서버를 소유하지 않습니다.
Alex S

그럴 수 있지. phpPgAdmin에서 : 테이블로 이동하여 내보내기를 클릭하고 "Structure Only"를 선택하면 스크립트가 있습니다
ChssPly76

나는 그들이이 설치에서 버그 일 것임에 틀림 없다-내가 그것을 할 때 오른쪽 프레임에 단지 빈 페이지를 보여준다 : /
Alex S

1
"표시"또는 "다운로드"옵션을 모두 시도 했습니까? 둘 다 작동하지 않으면 예, 버그 일 수 있습니다. 그렇다면 SQL을 통해해야하며 Dav의 대답에서 링크를 살펴보십시오.
ChssPly76

다운로드하면 빈 파일이 표시됩니다.
Alex S

6

어때

CREATE TABLE sample_table_copy AS (SELECT * FROM sample_table WHERE 1 = 2)

postgresql.org 답변


3
불행히도 이것은 키, 제약 조건 또는 기본값을 보존하지 않습니다.
sudo

1
'WHERE 1 = 2'를 표현하는 더 좋은 방법은 'WHERE false'또는 WHERE 절이 전혀없는 것이지만 대신 'LIMIT 0'입니다.
Kenyakorn Ketsombut
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.