PostgreSQL 데이터베이스 테이블에서 열의 위치를 어떻게 변경합니까?
다음을 시도했지만 실패했습니다.
ALTER TABLE person ALTER COLUMN dob POSITION 37;
" 바꿔 열 위치 PostgreSQL의 위키에"는 말합니다 :
PostgreSQL은 현재 테이블 의
attnum
열을 기반으로 열 순서를 정의pg_attribute
합니다. 열 순서를 변경하는 유일한 방법은 테이블을 다시 만들거나 원하는 레이아웃에 도달 할 때까지 열을 추가하고 데이터를 회전하는 것입니다.
그것은 매우 약하지만 표준 SQL에서는 열 위치를 변경하는 솔루션이 없습니다. 열의 서수 위치 변경을 지원하는 데이터베이스 브랜드는 SQL 구문에 대한 확장을 정의하고 있습니다.
한 가지 다른 아이디어가 떠 오릅니다 VIEW
. 기본 테이블에서 열의 물리적 위치를 변경하지 않고 원하는 방식으로 열 순서를 지정하는 a 를 정의 할 수 있습니다 .
이 게시물은 오래되었고 아마도 해결되었지만 동일한 문제가있었습니다. 새 열 순서를 지정하는 원래 테이블의보기를 만들어 해결했습니다.
여기에서 뷰를 사용하거나 뷰에서 새 테이블을 만들 수 있습니다.
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에서는 필드를 추가하는 동안 테이블 끝에 추가됩니다. 특정 위치에 삽입해야하는 경우
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;
현재로서는 할 수 없다고 생각합니다 . 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;
완료됩니다.
나는 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 단계 : 이제 뷰를 삭제하고 소스 테이블을 삭제하고 새 테이블의 이름을 이전 이름으로 바꿀 수 있습니다. 트릭은 성공적으로 끝났습니다.
'IT story' 카테고리의 다른 글
VS 2010 테스트 실행기 오류 "테스트가 실행되는 동안 에이전트 프로세스가 중지되었습니다." (0) | 2020.08.23 |
---|---|
`에서 스크롤 비활성화 (0) | 2020.08.23 |
div (높이)가 부모 나머지 높이를 차지하도록합니다. (0) | 2020.08.23 |
Emacs : 명령에 대한 키 바인딩 인쇄 또는 모든 키 바인딩 나열 (0) | 2020.08.23 |
테이블 대신 뷰를 사용하는 경우 (0) | 2020.08.23 |