복붙노트

[SQL] 어떻게 PostgreSQL 데이터베이스 테이블의 컬럼의 위치를 ​​변경합니까?

SQL

어떻게 PostgreSQL 데이터베이스 테이블의 컬럼의 위치를 ​​변경합니까?

나는 다음을 시도했다, 그러나 나는 실패했습니다 :

ALTER TABLE person ALTER COLUMN dob POSITION 37;

해결법

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

    1.PostgreSQL의 위키에서 "바꿔 열 위치"는 말합니다 :

    PostgreSQL의 위키에서 "바꿔 열 위치"는 말합니다 :

    그것은 매우 약하지만 그들의 방어, 표준 SQL에 어느 열을 재배치에 대한 해결책이 없습니다. 지지 컬럼의 서수의 위치를 ​​변화 데이터베이스 브랜드 SQL 구문에 대한 확장을 정의한다.

    또 다른 아이디어는 나에게 발생 : 당신이 어떻게 그 같은 기본 테이블의 컬럼의 물리적 위치를 변경하지 않고 열 순서를 지정하는 VIEW를 정의 할 수 있습니다.

  2. ==============================

    2.필드를 추가하는 동안의 PostgreSQL에서, 테이블의 끝에 추가된다. 우리는 특정 위치에 삽입해야하는 경우

    필드를 추가하는 동안의 PostgreSQL에서, 테이블의 끝에 추가된다. 우리는 특정 위치에 삽입해야하는 경우

    alter table tablename rename to oldtable;
    create table tablename (column defs go here);
    insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;
    
  3. ==============================

    3.이 포스팅은 과거와 아마 해결하지만 난 같은 문제가 있었다. 나는 새로운 열 순서를 지정 원래 테이블의 뷰를 작성하여 해결.

    이 포스팅은 과거와 아마 해결하지만 난 같은 문제가 있었다. 나는 새로운 열 순서를 지정 원래 테이블의 뷰를 작성하여 해결.

    여기에서 나도보기를 사용할 수 있습니다 또는보기에서 새 테이블을 만들 수 있습니다.

        CREATE VIEW original_tab_vw AS
        SELECT a.col1, a.col3, a.col4, a.col2
        FROM original_tab a
        WHERE a.col1 IS NOT NULL --or whatever
    
        SELECT * INTO new_table FROM original_tab_vw
    

    이름을 바꾸거나 원래의 테이블을 삭제하고 이전 테이블에 새 테이블의 이름을 설정합니다.

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

    4.하나는, 열 순서가 절대적으로 변경해야하고, 외래 키가 사용 중일 때 열을 다시 정렬하는 서투른 옵션이기는하지만, 첫 번째 덤프 데이터에 전체 데이터베이스입니다, 그럼 그냥 스키마를 (pg_dump의 -s 여기서 databaseName> databasename_schema.sql 덤프 ). 다음 편집 스키마 파일은 당신이 좋아하는 것처럼, 다음 스키마에서 데이터베이스를 다시, 그리고 마지막으로 새로 만든 데이터베이스에 데이터를 복원 열을 다시 정렬 할 수 있습니다.

    하나는, 열 순서가 절대적으로 변경해야하고, 외래 키가 사용 중일 때 열을 다시 정렬하는 서투른 옵션이기는하지만, 첫 번째 덤프 데이터에 전체 데이터베이스입니다, 그럼 그냥 스키마를 (pg_dump의 -s 여기서 databaseName> databasename_schema.sql 덤프 ). 다음 편집 스키마 파일은 당신이 좋아하는 것처럼, 다음 스키마에서 데이터베이스를 다시, 그리고 마지막으로 새로 만든 데이터베이스에 데이터를 복원 열을 다시 정렬 할 수 있습니다.

  5. ==============================

    5.PostgreSQL의 위키에서이 문서를 참조하십시오 : 당신이 현재 수 있다고 생각하지 않습니다.

    PostgreSQL의 위키에서이 문서를 참조하십시오 : 당신이 현재 수 있다고 생각하지 않습니다.

    이 글에서 세 가지 해결 방법은 다음과 같습니다 :

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

    6.PGAdmin 테이블을 열고 맨 아래에있는 SQL 창에서 SQL 표 문을 작성 복사합니다. 그런 다음 쿼리 도구를 열고 붙여 넣습니다. "-"드롭 테이블 라인의 테이블에 데이터가있는 경우,없는 경우 댓글을 삭제, 'NEW_NAME'에 테이블 이름을 변경합니다. 필요에 따라 열 순서를 편집합니다. 당신이 그것을 이동 한 경우 마지막 열에서 누락 / 불필요한 쉼표를 마음. 새로운 SQL 표 만들기 명령을 실행합니다. 새로 고침하고 ...함으로써 해결할 수.

    PGAdmin 테이블을 열고 맨 아래에있는 SQL 창에서 SQL 표 문을 작성 복사합니다. 그런 다음 쿼리 도구를 열고 붙여 넣습니다. "-"드롭 테이블 라인의 테이블에 데이터가있는 경우,없는 경우 댓글을 삭제, 'NEW_NAME'에 테이블 이름을 변경합니다. 필요에 따라 열 순서를 편집합니다. 당신이 그것을 이동 한 경우 마지막 열에서 누락 / 불필요한 쉼표를 마음. 새로운 SQL 표 만들기 명령을 실행합니다. 새로 고침하고 ...함으로써 해결할 수.

    설계 단계에서 빈 테이블의 경우이 방법은 매우 실용적입니다.

    테이블 데이터를 갖는 경우, 우리는 물론 데이터의 열 순서를 재정렬 할 필요가있다. 이것은 쉽게 : 사용 INSERT가와의 새로운 버전으로 이전 테이블을 가져올 수 :

    INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
    

    ... C2, C3는 C1은 열 C1, C2, 새로운 위치에 이전 테이블의 C3는 곳. 참고이 경우 당신은 편집 된 '옛'테이블의 '새'이름을 사용해야합니다, 또는 당신은 당신의 데이터가 손실됩니다하십시오. 텍스트 편집기에 새 테이블 구조를 복사하고 INSERT 문으로 복사하기 전에이 새로운 열 목록을 만들 위와 같이 경우 열 이름은 많은 긴 및 / 또는 복합은 동일한 방법입니다.

    모든 것이 잘 것을 확인한 후, 기존 테이블을 삭제하고 옛날 ALTER TABLE에게 ​​새로운 이름 바꾸기를 사용하여 '옛'에 '새'이름을 변경; 작업이 완료된다.

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

    7.나는 다시 주문 테이블의 많은 작업을하고 있었고, 난 나를 위해 모든 것을 할 수있는 스크립트를 만들 수 있도록 반복해서 같은 쿼리를 작성해야하고 싶지 않았다. 본질적으로, 그것은 :

    나는 다시 주문 테이블의 많은 작업을하고 있었고, 난 나를 위해 모든 것을 할 수있는 스크립트를 만들 수 있도록 반복해서 같은 쿼리를 작성해야하고 싶지 않았다. 본질적으로, 그것은 :

    그것은 다음과 같은 간단한 명령을 실행하여 사용할 수 있습니다 :

    ./reorder.py -n schema -d database table \
        first_col second_col ... penultimate_col ultimate_col --migrate
    

    당신이 확인하고 pg_dump의에 기반 큰 이유 I 이었다는 것을, 그것을 테스트 할 수 있도록 그것은 SQL을 출력합니다. 당신은 여기 github에의 REPO를 찾을 수 있습니다.

  8. ==============================

    8.내가 장고를 사용하고 두통을하지 않으려면 각 테이블의 id 컬럼을 필요로한다. 불행하게도, 나는 부주의 내 테이블 bp.geo_location_vague이 필드를 포함하지 않았다. 나는 약간의 트릭을 이니셜. 1 단계:

    내가 장고를 사용하고 두통을하지 않으려면 각 테이블의 id 컬럼을 필요로한다. 불행하게도, 나는 부주의 내 테이블 bp.geo_location_vague이 필드를 포함하지 않았다. 나는 약간의 트릭을 이니셜. 1 단계:

    CREATE VIEW bp.geo_location_vague_vw AS
        SELECT 
            a.id, -- I change order of id column here. 
            a.in_date,
            etc
        FROM bp.geo_location_vague a
    

    2 단계 : (! 테이블을 생성하지 않고 - 테이블이 자동으로 생성됩니다)

    SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw
    

    3 단계 :

    CREATE SEQUENCE bp.tbl_tbl_id_seq;
    ALTER TABLE bp.geo_location_vague_cp2 ALTER COLUMN id SET DEFAULT nextval('tbl_tbl_id_seq');
    ALTER SEQUENCE bp.tbl_tbl_id_seq OWNED BY bp.geo_location_vague_cp2.id;
    SELECT setval('tbl_tbl_id_seq', COALESCE(max(id), 0)) FROM bp.geo_location_vague_cp2;
    

    나는 테이블에 BIGSERIAL 유사 데이터가 필요하기 때문에. SELECT * 후 BIGINT 유형을 생성 할 페이지에 BIGSERIAL insetad.

    4 단계 : 이제 우리는,보기를 드롭 소스 테이블을 삭제하고 이전 이름에서 새 테이블의 이름을 바꿀 수 있습니다. 트릭은 성공적으로 끝났다.

  9. ==============================

    9.그것을 가능하게하는 몇 가지 해결 방법이 있습니다 :

    그것을 가능하게하는 몇 가지 해결 방법이 있습니다 :

    https://tableplus.com/blog/2018/09/postgresql-is-it-possible-to-alter-column-order-position-in-a-table.html

  10. from https://stackoverflow.com/questions/285733/how-do-i-alter-the-position-of-a-column-in-a-postgresql-database-table by cc-by-sa and MIT license