programing

Postgre에서 열의 위치를 변경하는 방법SQL 데이터베이스 테이블?

bestprogram 2023. 5. 17. 23:32

Postgre에서 열의 위치를 변경하는 방법SQL 데이터베이스 테이블?

다음을 시도했지만 실패했습니다.

ALTER TABLE person ALTER COLUMN dob POSITION 37;

Postgre의 "칼럼 위치 변경"SQL Wiki의 설명:

Postgre를 으로 열 합니다.SQL은 현재 다음을 기준으로 열 순서를 정의합니다.attnumpg_attribute테이블. 열 순서를 변경하는 유일한 방법은 테이블을 다시 만들거나 원하는 레이아웃에 도달할 때까지 열을 추가하고 데이터를 회전하는 것입니다.

이는 매우 약하지만 표준 SQL에서는 열 위치를 변경할 수 있는 솔루션이 없습니다.열의 순서 위치 변경을 지원하는 데이터베이스 브랜드는 SQL 구문에 대한 확장을 정의합니다.

: ▁a를 정의할 수 . 당신은 정의할 수 있습니다.VIEW기본 테이블에서 열의 실제 위치를 변경하지 않고 원하는 열의 순서를 지정합니다.

포스트그레에서SQL은 필드를 추가하는 동안 테이블 끝에 추가됩니다.특정 위치에 삽입해야 하는 경우

    alter table tablename rename to oldtable;
    create table tablename (column defs go here); ### with all the constraints
    insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;

변경해야 키가 때 중 하나는 로 덤프한 것입니다.pg_dump -s databasename > databasename_schema.sql그런 다음 스키마 파일을 편집하여 원하는 대로 열을 재정렬한 다음 스키마에서 데이터베이스를 다시 만들고 마지막으로 새로 만든 데이터베이스로 데이터를 복원합니다.

이 게시물은 오래되어 아마 해결되었을 것이지만 저도 같은 문제가 있었습니다.새 열 순서를 지정하는 원래 테이블의 보기를 만들어 해결했습니다.

여기서 보기를 사용하거나 보기에서 새 테이블을 만들 수 있습니다.

CREATE VIEW original_tab_vwASa.col1, a.col3, a.col4, a.col2를 선택합니다.원본_타바여기서 a.col1은 null이 아닙니다. -- 또는 무엇이든 상관없습니다.
선택 * original_tab_vw에서 new_table로 선택

원래 테이블의 이름을 변경하거나 삭제하고 새 테이블의 이름을 이전 테이블로 설정합니다.

저는 당신이 현재 할 수 있다고 생각하지 않습니다: Postgresql 위키에 있는기사를 보세요.

이 문서의 세 가지 해결 방법은 다음과 같습니다.

  1. 테이블 다시 만들기
  2. 열 추가 및 데이터 이동
  3. 보기를 사용하여 차이점을 숨깁니다.

PGAdmin에서 테이블을 열고 하단의 SQL 창에서 SQL Create Table 문을 복사합니다.그런 다음 쿼리 도구를 열고 붙여넣습니다.테이블에 데이터가 있으면 테이블 이름을 'new_name'으로 변경하고, 없으면 테이블 삭제 줄에서 주석 "--"을 삭제합니다.필요에 따라 열 순서를 편집합니다.이동한 경우 마지막 열의 누락/잔여 콤마를 주의하십시오.새 SQL 테이블 만들기 명령을 실행합니다.새로 고침 및...부랴부랴

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

테이블에 데이터가 있을 경우 데이터의 열 순서도 다시 정렬해야 합니다.이것은 쉽습니다: 사용하세요.INSERT다음을 사용하여 이전 테이블을 새 버전으로 가져오기

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

서...어디에c2,c3,c1는 열입니다.c1,c2,c3새 위치에 있는 오래된 테이블의.이 경우 편집된 '이전' 테이블에 '새' 이름을 사용해야 합니다. 그렇지 않으면 데이터가 손실됩니다.열 이름이 여러 개인 경우 위와 동일한 방법을 사용하여 새 테이블 구조를 텍스트 편집기에 복사하고 새 열 목록을 작성한 후 다음으로 복사합니다.INSERT진술.

것이한 후에,DROP을 'old'로, 'new' 이름을 '.ALTER TABLE new RENAME TO old;그리고 당신은 끝났습니다.

저는 많은 테이블을 다시 주문하는 작업을 하고 있었고 같은 쿼리를 반복해서 작성하는 것을 원하지 않았기 때문에 저를 위해 모든 것을 할 수 있는 스크립트를 만들었습니다.기본적으로 다음과 같습니다.

  1. 테블작을성 SQL다니에서 생성 .pg_dump
  2. 덤프에서 사용 가능한 모든 열을 가져옵니다.
  3. 열을 원하는 순서로 배치합니다.
  4. 원을수니다를 합니다.pg_dump데이터를 사용하여 순서가 다시 지정된 테이블을 만들기 위한 쿼리
  5. 오래된 테이블 삭제
  6. 새 테이블의 이름을 이전 테이블과 일치하도록 변경

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

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

그것은 당신이 그것을 검증하고 테스트할 수 있도록 SQL을 출력합니다, 그것이 제가 그것을 기반으로 한 큰 이유였습니다.pg_dump당신은 여기서 깃허브 레포를 찾을 수 있습니다.

저는 장고를 사용하고 있는데 머리가 아프지 않으려면 테이블마다 id 열이 있어야 합니다.안타깝게도 제가 부주의해서 테이블 bp.geo _location_message에 이 필드가 포함되지 않았습니다.제가 작은 속임수를 썼어요.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;

왜냐하면 저는 표에 큰 시리얼 유사형이 필요하기 때문입니다.SELECT * into pg는 bigint type을 bigserial 대신 작성합니다.

4단계: 이제 보기를 삭제하고 원본 테이블을 삭제하고 이전 이름으로 새 테이블의 이름을 변경할 수 있습니다.트릭이 성공적으로 종료되었습니다.

이를 가능하게 하기 위한 몇 가지 해결 방법이 있습니다.

  1. 전체 테이블 다시 만들기

  2. 현재 테이블 내에 새 열 작성

  3. 보기 만들기

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

이렇게 열 순서를 바꾸려고 하는 사람들은 테이블 전체가 엉망이 되기 때문에 작동하지 않을 것이라는 것을 알아야 합니다.다음과 같은 오류가 표시됩니다. [XX000] 오류: 잘못된 메모리 할당 요청 크기 18446744073709551613

유감스럽게도, 애트넘은 데이터 검색뿐만 아니라 저장에도 사용되는 것 같습니다.

테이블 전체를 삭제하는 아이디어는 모두 좋고 괜찮지만 모든 FK, IX 등을 삭제해야 합니다.저는 아마 제 칼럼을 뒤로 하고 사는 법을 배울 것입니다.

select *
from information_schema.columns
where table_name = 'table1';

update pg_catalog.pg_attribute
set attnum = 10 where attname = 'column_on_9_position_to_move_to_7';

update pg_catalog.pg_attribute
set attnum = 9 where attname = 'column_on_7_position_to_move_to_9';

update pg_catalog.pg_attribute
set attnum = 7 where attname = 'column_on_9_position_to_move_to_7';

언급URL : https://stackoverflow.com/questions/285733/how-do-i-alter-the-position-of-a-column-in-a-postgresql-database-table