다음을 시도했지만 실패했습니다.
ALTER TABLE person ALTER COLUMN dob POSITION 37;
다음을 시도했지만 실패했습니다.
ALTER TABLE person ALTER COLUMN dob POSITION 37;
답변:
" 바꿔 열 위치 PostgreSQL의 위키에"는 말합니다 :
PostgreSQL은 현재 테이블 의
attnum
열을 기반으로 열 순서를 정의pg_attribute
합니다. 열 순서를 변경하는 유일한 방법은 테이블을 다시 만들거나 원하는 레이아웃에 도달 할 때까지 열을 추가하고 데이터를 회전하는 것입니다.
그것은 매우 약하지만 표준 SQL에서는 열 위치를 변경하는 솔루션이 없습니다. 열의 서수 위치 변경을 지원하는 데이터베이스 브랜드는 SQL 구문에 대한 확장을 정의하고 있습니다.
한 가지 다른 아이디어가 떠 오릅니다 VIEW
. 기본 테이블에서 열의 물리적 위치를 변경하지 않고 원하는 방식으로 열 순서를 지정하는 a 를 정의 할 수 있습니다 .
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;
이 게시물은 오래되었고 아마도 해결되었지만 동일한 문제가있었습니다. 새 열 순서를 지정하는 원래 테이블의보기를 만들어 해결했습니다.
여기에서 뷰를 사용하거나 뷰에서 새 테이블을 만들 수 있습니다.
original_tab_vw 그대로보기 만들기 a.col1, a.col3, a.col4, a.col2 선택 from original_tab a a.col1이 NULL이 아닌 경우
SELECT * INTO new_table FROM original_tab_vw
원래 테이블의 이름을 바꾸거나 삭제하고 새 테이블의 이름을 이전 테이블로 설정하십시오.
하나는 열 순서가 절대적으로 변경되어야하고 외래 키가 사용 중일 때 열을 재정렬하는 어색한 옵션이지만 먼저 데이터로 전체 데이터베이스를 덤프 한 다음 스키마 만 덤프하는 것입니다 ( pg_dump -s databasename > databasename_schema.sql
). 다음으로 스키마 파일을 편집하여 원하는대로 열을 재정렬 한 다음 스키마에서 데이터베이스를 다시 만든 다음 마지막으로 새로 만든 데이터베이스로 데이터를 복원합니다.
현재로서는 할 수 없다고 생각합니다 . Postgresql 위키에서이 기사를 참조하십시오. . .
이 문서의 세 가지 해결 방법은 다음과 같습니다.
PGAdmin에서 테이블을 열고 하단의 SQL 창에서 SQL Create Table 문을 복사합니다. 그런 다음 검색어 도구를 열고 붙여 넣습니다. 테이블에 데이터가 있으면 테이블 이름을 'new_name'으로 변경하고 그렇지 않은 경우 테이블 삭제 행에서 주석 "-"을 삭제하십시오. 필요에 따라 열 순서를 편집하십시오. 이동 한 경우를 대비하여 마지막 열에서 누락 / 불필요한 쉼표에 유의하십시오. 새로운 SQL Create Table 명령을 실행합니다. 새로 고침 및 ... voilà.
디자인 단계의 빈 테이블의 경우이 방법은 매우 실용적입니다.
테이블에 데이터가있는 경우 데이터의 열 순서도 다시 정렬해야합니다. 이것은 쉽습니다. 다음을 사용 INSERT
하여 이전 테이블을 새 버전으로 가져 오는 데 사용 합니다.
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
... 여기서 c2
, c3
, c1
열이 c1
, c2
, c3
새로운 위치에 이전 테이블의. 이 경우 편집 된 '이전'테이블에 '새'이름 을 사용해야 합니다. 그렇지 않으면 데이터가 손실됩니다 . 열 이름이 많고 길거나 복잡한 경우 위와 동일한 방법을 사용하여 새 테이블 구조를 텍스트 편집기에 복사하고 INSERT
문에 복사하기 전에 거기에 새 열 목록을 만듭니다 .
모든 것이 잘되었는지 확인한 후 DROP
이전 테이블을 사용하여 'new'이름을 'old'로 변경하면 ALTER TABLE new RENAME TO old;
완료됩니다.
나는 많은 테이블을 재정렬하는 작업을하고 있었고 동일한 쿼리를 반복해서 작성하고 싶지 않았기 때문에 모든 작업을 수행하는 스크립트를 만들었습니다. 기본적으로 다음과 같습니다.
pg_dump
pg_dump
데이터로 재정렬 된 테이블을 생성 쿼리를다음과 같은 간단한 명령을 실행하여 사용할 수 있습니다.
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
그것은 당신이 그것을 확인하고 테스트 할 수 있도록 sql을 인쇄합니다. 이것이 제가 pg_dump
. 여기 에서 github 저장소를 찾을 수 있습니다 .
나는 Django를 사용하고 두통을 원하지 않으면 각 테이블에 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 pseudotype이 필요하기 때문입니다. SELECT * 후 pg는 bigint 유형 insetad bigserial을 생성합니다.
4 단계 : 이제 뷰를 삭제하고 소스 테이블을 삭제하고 새 테이블의 이름을 이전 이름으로 바꿀 수 있습니다. 트릭은 성공적으로 끝났습니다.
이를 가능하게하는 몇 가지 해결 방법이 있습니다.
전체 테이블 다시 만들기
현재 테이블 내에 새 열 만들기
보기 만들기