Làm cách nào tôi có thể chỉ định vị trí cho một cột mới trong PostgreSQL?


74

Nếu tôi có một bảng với các cột:

id | name | created_date

và muốn thêm một cột, tôi sử dụng:

alter table my_table add column email varchar(255)

Sau đó, cột được thêm vào sau created_datecột.

Có cách nào tôi có thể chỉ định vị trí cho cột mới không? ví dụ để tôi có thể thêm nó sau namevà lấy một bảng như sau:

id | name | email | created_date

4
Không cần phải làm điều đó. Chỉ cần đặt chúng vào câu lệnh chọn của bạn theo thứ tự bạn muốn.
a_horse_with_no_name

@jonas vì vậy bạn cũng có thể tạo một viewchương trình hiển thị theo thứ tự đó ... về mặt kỹ thuật vị trí của cột không quan trọng vì bạn có thể xác định chúng theo bất kỳ thứ tự nào trong truy vấn ... và bạn thường không nên thực hiệnselect *
xenoterracide

2
@a_horse: Chà, làm việc khó hơn nhiều (với tư cách là nhà phát triển / quản trị viên) với các bảng khi các cột có nhiều đơn hàng khác nhau. Khi tôi có 15 cột trong một bảng, tôi thực sự muốn có chúng theo cùng một thứ tự trong tất cả các cơ sở dữ liệu.
Jonas

2
@jonas bạn có thể xác định tên cột khi thực hiện chèn và cập nhật và do đó làm cho thứ tự không liên quan.
xenoterracide

2
@Jonas: Sau đó, hãy viết thay thế của riêng bạn cho \ d báo cáo các cột theo thứ tự bạn muốn (đó chỉ là truy vấn trên các bảng hệ thống: thử sử dụng công psql -Etắc để xem truy vấn thực tế)
Jack Douglas

Câu trả lời:


54

ALTER TABLE ADD COLUMNsẽ chỉ thêm cột mới vào cuối, như là cột cuối cùng. Để tạo một cột mới ở một vị trí khác, bạn cần tạo lại bảng và sao chép dữ liệu từ bảng cũ / hiện tại trong bảng mới này.



4
Điều đó đúng .. nhưng có ai thực sự sử dụng phương pháp này không? :-)
Mary

2
Nếu nó dễ hơn là tạo lại bảng và tất cả các bảng con , khóa ngoại và trợ cấp :) Tôi nghĩ rằng liên kết có thể hữu ích theo cách nào đó vì nó đưa ra lời giải thích về lý do tại sao bạn không thể chỉ định vị trí và hy vọng rằng nó có thể được thực hiện trong phiên bản tương lai.
Jack Douglas

22

Bạn sẽ cần tạo lại bảng nếu bạn muốn một thứ tự nhất định. Chỉ cần làm một cái gì đó như:

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;

Tạo các chỉ mục khi cần thiết, vv


2

Nếu bạn muốn điều này chỉ vì vẻ bề ngoài, tôi thấy dễ dàng hơn để giữ chế độ xem cho mỗi bảng với thứ tự các cột mong muốn và chọn từ nó thay vì bảng.

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;

Đối với tất cả các mục đích khác (như chèn, kết hợp), tốt hơn là luôn luôn chỉ định danh sách cột.

-- 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.