Postgre에서 열의 위치를 변경하는 방법SQL 데이터베이스 테이블?
다음을 시도했지만 실패했습니다.
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Postgre의 "칼럼 위치 변경"SQL Wiki의 설명:
Postgre를 으로 열 합니다.SQL은 현재 다음을 기준으로 열 순서를 정의합니다.
attnum
열pg_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 위키에 있는 이 기사를 보세요.
이 문서의 세 가지 해결 방법은 다음과 같습니다.
- 테이블 다시 만들기
- 열 추가 및 데이터 이동
- 보기를 사용하여 차이점을 숨깁니다.
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;
그리고 당신은 끝났습니다.
저는 많은 테이블을 다시 주문하는 작업을 하고 있었고 같은 쿼리를 반복해서 작성하는 것을 원하지 않았기 때문에 저를 위해 모든 것을 할 수 있는 스크립트를 만들었습니다.기본적으로 다음과 같습니다.
- 테블작을성 SQL다니에서 생성 .
pg_dump
- 덤프에서 사용 가능한 모든 열을 가져옵니다.
- 열을 원하는 순서로 배치합니다.
- 원을수니다를 합니다.
pg_dump
데이터를 사용하여 순서가 다시 지정된 테이블을 만들기 위한 쿼리 - 오래된 테이블 삭제
- 새 테이블의 이름을 이전 테이블과 일치하도록 변경
다음과 같은 간단한 명령을 실행하여 사용할 수 있습니다.
./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단계: 이제 보기를 삭제하고 원본 테이블을 삭제하고 이전 이름으로 새 테이블의 이름을 변경할 수 있습니다.트릭이 성공적으로 종료되었습니다.
이를 가능하게 하기 위한 몇 가지 해결 방법이 있습니다.
전체 테이블 다시 만들기
현재 테이블 내에 새 열 작성
보기 만들기
이렇게 열 순서를 바꾸려고 하는 사람들은 테이블 전체가 엉망이 되기 때문에 작동하지 않을 것이라는 것을 알아야 합니다.다음과 같은 오류가 표시됩니다. [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
'programing' 카테고리의 다른 글
Apache/Nginx와 함께 Node.js를 사용하는 경우와 비교하여 Node.js만 사용 (0) | 2023.05.17 |
---|---|
프로그램에 일관된 초기 현재 작업 디렉터리를 설정하려면 어떻게 해야 합니까? (0) | 2023.05.17 |
bash/sed 스크립트를 사용하여 텍스트 파일의 첫 줄을 제거하려면 어떻게 해야 합니까? (0) | 2023.05.17 |
Git 오류: src refspec 마스터가 일치하지 않습니다. (0) | 2023.05.17 |
C#에서 배열에서 요소를 삭제하는 방법 (0) | 2023.05.17 |