복붙노트

[SQL] 포스트 그레스에서 (인덱스 포함) 테이블을 복사

SQL

포스트 그레스에서 (인덱스 포함) 테이블을 복사

나는 포스트 그레스의 테이블이 있습니다. 나는 그것에서 일부 데이터를 삭제해야합니다. 나는 임시 테이블을 만들려고에서 데이터를 복사, 인덱스를 다시 만들고 내가 필요로하는 행을 삭제했다. 이 원본 테이블의 데이터 소스이기 때문에 나는 원래 테이블에서하지 삭제하면 데이터. 한 경우에는 내가 X를 삭제에 따라 몇 가지 결과를 얻을 필요가 다른 경우에, 나는 Y. 그래서 주위 및 사용 가능한 모든에게 항상 원래 데이터가 필요 삭제해야합니다.

그것은 조금 보인다 그러나 바보 테이블을 재현하고 다시 복사하고 인덱스를 다시 작성하십시오. "나는 구조, 데이터 및 인덱스를 포함하여이 테이블의 완전한 별도의 사본을 원하는"이라고 말해 포스트 그레스에 어쨌든 있나요?

불행하게도 PostgreSQL의 '는 "테이블 만들기 .. LIKE X를 포함 하나의 INDEXES이 없습니다

해결법

  1. ==============================

    1.새로운 PostgreSQL는 (8.3 문서에 따라 이후) "을 포함 인덱스"를 사용할 수 있습니다 :

    새로운 PostgreSQL는 (8.3 문서에 따라 이후) "을 포함 인덱스"를 사용할 수 있습니다 :

    # select version();
                                                 version
    -------------------------------------------------------------------------------------------------
     PostgreSQL 8.3.7 on x86_64-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
    (1 row)
    

    당신은 내가 8.3에서 테스트하고 있습니다 볼 수 있듯이.

    이제, 테이블을 만들 수 있습니다 :

    # create table x1 (id serial primary key, x text unique);
    NOTICE:  CREATE TABLE will create implicit sequence "x1_id_seq" for serial column "x1.id"
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "x1_pkey" for table "x1"
    NOTICE:  CREATE TABLE / UNIQUE will create implicit index "x1_x_key" for table "x1"
    CREATE TABLE
    

    그리고 그것은 어떻게 보이는지 확인 :

    # \d x1
                             Table "public.x1"
     Column |  Type   |                    Modifiers
    --------+---------+-------------------------------------------------
     id     | integer | not null default nextval('x1_id_seq'::regclass)
     x      | text    |
    Indexes:
        "x1_pkey" PRIMARY KEY, btree (id)
        "x1_x_key" UNIQUE, btree (x)
    

    이제 우리는 구조를 복사 할 수 있습니다 :

    # create table x2 ( like x1 INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES );
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "x2_pkey" for table "x2"
    NOTICE:  CREATE TABLE / UNIQUE will create implicit index "x2_x_key" for table "x2"
    CREATE TABLE
    

    그리고 구조를 확인 :

    # \d x2
                             Table "public.x2"
     Column |  Type   |                    Modifiers
    --------+---------+-------------------------------------------------
     id     | integer | not null default nextval('x1_id_seq'::regclass)
     x      | text    |
    Indexes:
        "x2_pkey" PRIMARY KEY, btree (id)
        "x2_x_key" UNIQUE, btree (x)
    

    당신이 사용하는 경우 PostgreSQL은 사전 8.3, 당신은 단순히 1 표, 덤프 변경 테이블의 이름을 지정하고 다시로드 옵션을 pg_dump를 사용 "-t"할 수 있습니다 :

    => pg_dump -t x2 | sed 's/x2/x3/g' | psql
    SET
    SET
    SET
    SET
    SET
    SET
    SET
    SET
    CREATE TABLE
    ALTER TABLE
    ALTER TABLE
    ALTER TABLE
    

    이제 테이블은 다음과 같습니다

    # \d x3
                             Table "public.x3"
     Column |  Type   |                    Modifiers
    --------+---------+-------------------------------------------------
     id     | integer | not null default nextval('x1_id_seq'::regclass)
     x      | text    |
    Indexes:
        "x3_pkey" PRIMARY KEY, btree (id)
        "x3_x_key" UNIQUE, btree (x)
    
  2. ==============================

    2.

    [CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
        [ (column_name [, ...] ) ]
        [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
        [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
        [ TABLESPACE tablespace ]
        AS query][1]  
    

    다음 예는

    CREATE TABLE films_recent AS
      SELECT * FROM films WHERE date_prod >= '2002-01-01';
    

    처음부터 새 테이블을 만들 수있는 다른 방법은 사용하는 것입니다

        CREATE TABLE films_recent (LIKE films INCLUDING INDEXES);  
    
        INSERT INTO films_recent
             SELECT *
               FROM books
              WHERE date_prod >= '2002-01-01';  
    

    두 번째 방법을 사용하는 경우 주 PostgreSQL는 수정 테이블 문제에 대한 패치를 가지고

  3. ==============================

    3.나는 그것을 추정 ...

    나는 그것을 추정 ...

    delete from yourtable
    where <condition(s)>
    

    ... 어떤 이유로 작동하지 않습니다. (케어는 그 이유를 공유하는 방법을?)

    pg_dump의와 pg_restore의로보십시오. 일부 영리 옵션을 pg_dump의 사용과 트릭을 할 수 pg_restoring 전에 아마도 출력을 편집.

    힘은 당신이 더 나은 전망을 개시 할 경우 데이터의 "만약에"타입 분석을하고 있기 때문에, 나는 궁금하다.

    당신은 당신이 제외 할 무엇의 부정을 기반으로 테스트하려는 각 시나리오에 대한 뷰를 정의 할 수 있습니다. 즉, 포함 할 내용에 따라 뷰를 정의합니다. 예를 들어, 당신은 당신이 "삭제"데이터에 "창"을 원하는 경우 X = Y가, 다음 행 곳으로 뷰를 생성 할 행 (X! = Y).

    뷰는 정의 쿼리로 (시스템 카탈로그) 데이터베이스에 저장됩니다. 때마다 당신은 기본 쿼리까지보기를 데이터베이스 서버 외모를 조회하도록 정의 IT와 (당신이 사용하는 다른 조건으로 AND) 것을 실행합니다. 이 방법의 몇 가지 이점이 있습니다 :

    물론 트레이드 오프가있다. 뷰는 가상 테이블이 아닌 "진짜"(기본) 테이블이기 때문에, 당신은 실제로 (아마도 복잡한) 쿼리 당신이 그것을 액세스 할 때마다 실행하고 있습니다. 이것은 조금 아래로 물건을 느려질 수 있습니다. 그러나 그것은하지 않을 수 있습니다. 그것은 많은 문제 (크기와 데이터의 특성, 시스템 카탈로그 통계의 품질, 하드웨어의 속도, 사용 부하, 그리고 훨씬 더)에 따라 달라집니다. 당신이 그것을 시도하기 전까지는 알 수 없습니다. 만약 (그리고 경우에만) 당신은 실제로 당신은 다른 옵션을 볼 수있는, 성능이 너무 느리다는 사실을 알게 될 것입니다. (테이블의 구체화 뷰, 복사, ... 시간을위한 공간을 거래 아무것도.)

  4. ==============================

    4.당신이 원하는 데이터를 잡기 위해 선택을 사용하여 새 테이블을 만듭니다. 그런 다음 새 것으로 이전 테이블을 교환합니다.

    당신이 원하는 데이터를 잡기 위해 선택을 사용하여 새 테이블을 만듭니다. 그런 다음 새 것으로 이전 테이블을 교환합니다.

    create table mynewone as select * from myoldone where ...
    mess (re-create) with indexes after the table swap.
    
  5. ==============================

    5.웹에 많은 답변이 있습니다, 그 중 하나는 여기에서 찾을 수 있습니다.

    웹에 많은 답변이 있습니다, 그 중 하나는 여기에서 찾을 수 있습니다.

    이 같은 일을 결국 :

    create table NEW ( like ORIGINAL including all);
    insert into NEW select * from ORIGINAL
    

    이 트리거와 제약 조건을 포함하여 스키마 및 인덱스를 포함한 데이터,하지만 복사합니다. 인덱스가 카운터가 증가합니다 중 하나를 테이블에 새 행을 추가 할 때 있도록 원래의 테이블을 공유합니다.

  6. ==============================

    6.웹에 많은 답변이 있습니다, 그 중 하나는 여기에서 찾을 수 있습니다.

    웹에 많은 답변이 있습니다, 그 중 하나는 여기에서 찾을 수 있습니다.

    이 같은 일을 결국 :

    create table NEW ( like ORIGINAL including all);
    insert into NEW select * from ORIGINAL
    

    이 트리거와 제약 조건을 포함하여 스키마 및 인덱스를 포함한 데이터,하지만 복사합니다. 인덱스가 카운터가 증가합니다 중 하나를 테이블에 새 행을 추가 할 때 있도록 원래의 테이블을 공유합니다.

    또한 여기에 답변을 참조하십시오.

  7. ==============================

    7.간단한 방법이 모두 포함입니다 :

    간단한 방법이 모두 포함입니다 :

    CREATE TABLE new_table (LIKE original_table INCLUDING ALL);
    
  8. from https://stackoverflow.com/questions/198141/copy-a-table-including-indexes-in-postgres by cc-by-sa and MIT license