PostgreSQL에서 새 열의 위치를 ​​어떻게 지정합니까?


74

열이있는 테이블이있는 경우 :

id | name | created_date

열을 추가하고 싶습니다.

alter table my_table add column email varchar(255)

그런 다음 열 뒤에 열이 추가 created_date됩니다.

새 열의 위치를 ​​지정할 수있는 방법이 있습니까? 예를 들어 나중에 추가하고 다음 name과 같은 테이블을 얻을 수 있습니다 .

id | name | email | created_date

4
그렇게 할 필요가 없습니다. 원하는 순서대로 select 문에 넣으십시오.
a_horse_with_no_name

@jonas 그래서 당신은 또한 view그 순서대로 그 쇼를 만들 수 있습니다 ... 기술적으로 열의 위치는 쿼리에서 어떤 순서 로나 정의 할 수 있기 때문에 중요하지 않아야합니다 ... 그리고 일반적으로하지 않아야합니다select *
xenoterracide 2016 년

2
@a_horse : 글쎄, 열이 다른 순서를 가질 때 (개발자 / 관리자로서) 테이블을 다루는 것이 훨씬 더 어렵다. 테이블에 15 개의 열이 있으면 모든 데이터베이스에서 동일한 순서로 열을 사용하는 것이 좋습니다.
Jonas

2
@jonas 삽입 및 업데이트를 수행 할 때 열 이름을 정의 할 수 있으므로 순서와 관련이 없습니다.
xenoterracide 2016 년

2
@Jonas : 그런 다음 원하는 순서대로 열을보고하는 \ d 대신 자신의 대안을 작성하십시오 (시스템 테이블에 대한 쿼리 일뿐입니다 psql -E. 실제 쿼리를 보려면 스위치를 사용하십시오)
Jack Douglas

답변:


54

ALTER TABLE ADD COLUMN끝에 새 열을 마지막 열만 추가합니다. 다른 위치에 새 열을 작성하려면 테이블을 다시 작성하고이 새 테이블의 이전 / 현재 테이블에서 데이터를 복사해야합니다.



4
맞습니다 ..하지만이 방법을 실제로 사용하는 사람이 있습니까? :-)
마리안

2
테이블과 모든 자식 테이블 , 외래 키 및 보조금을 다시 만드는 것이 더 쉬운 경우 :) 위치를 지정할 수없는 이유에 대한 설명을 제공하고 링크가 향후 버전.
잭 더글러스

22

특정 순서를 원하면 테이블을 다시 작성해야합니다. 그냥 다음과 같이하십시오 :

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

필요에 따라 색인을 작성하십시오.


2

이 모양을 원하는 경우 원하는 열 순서로 각 테이블별로보기를 유지하고 테이블 대신 테이블에서 선택하는 것이 더 쉽다는 것을 알았습니다.

create table my_table (
create view view_my_table as
  select id, name, created_date from my_table;

-- adding a new column
begin;
alter table my_table add column email varchar(255);
drop view view_my_table;
create view view_my_table as
  select id, name, email, created_date from my_table;
commit;

다른 모든 목적 (삽입, 공용체 등)의 경우 항상 열 목록을 지정하는 것이 좋습니다.

-- bad
insert into my_table values (...);
(select * from my_table)
  union all
(select * from my_table);

-- good
insert into my_table (id, name, email, created_date) values (...);
(select id, name, email, created_date from my_table)
  union all
(select id, name, email, created_date from my_table);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.