Tôi đã thử những cách sau nhưng không thành công:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Tôi đã thử những cách sau nhưng không thành công:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Câu trả lời:
" Vị trí cột thay thế " trong Wiki PostgreSQL cho biết:
PostgreSQL hiện xác định thứ tự cột dựa trên
attnum
cột củapg_attribute
bảng. Cách duy nhất để thay đổi thứ tự cột là tạo lại bảng hoặc thêm cột và xoay dữ liệu cho đến khi bạn đạt được bố cục mong muốn.
Điều đó khá yếu, nhưng để bảo vệ họ, trong SQL tiêu chuẩn, không có giải pháp nào để định vị lại một cột. Các thương hiệu cơ sở dữ liệu hỗ trợ thay đổi vị trí thứ tự của cột đang xác định một phần mở rộng cho cú pháp SQL.
Một ý tưởng khác xảy ra với tôi: bạn có thể xác định một VIEW
chỉ định thứ tự của các cột theo cách bạn muốn, mà không thay đổi vị trí thực của cột trong bảng cơ sở.
Trong PostgreSQL, khi thêm một trường, nó sẽ được thêm vào cuối bảng. Nếu chúng ta cần chèn vào vị trí cụ thể thì
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;
Bài đăng này đã cũ và có thể đã được giải quyết nhưng tôi đã gặp vấn đề tương tự. Tôi đã giải quyết nó bằng cách tạo chế độ xem bảng gốc chỉ định thứ tự cột mới.
Từ đây, tôi có thể sử dụng chế độ xem hoặc tạo một bảng mới từ chế độ xem.
TẠO XEM original_tab_vw NHƯ CHỌN a.col1, a.col3, a.col4, a.col2 FROM original_tab a Ở đâu a.col1 KHÔNG ĐỦ - hoặc bất cứ điều gì
CHỌN * VÀO new_table TỪ original_tab_vw
Đổi tên hoặc bỏ bảng ban đầu và đặt tên của bảng mới thành bảng cũ.
Một, mặc dù một tùy chọn vụng về để sắp xếp lại các cột khi thứ tự cột hoàn toàn phải thay đổi và các khóa ngoại đang được sử dụng, trước tiên là kết xuất toàn bộ cơ sở dữ liệu với dữ liệu, sau đó chỉ kết xuất lược đồ ( pg_dump -s databasename > databasename_schema.sql
). Tiếp theo chỉnh sửa tệp lược đồ để sắp xếp lại các cột theo ý muốn, sau đó tạo lại cơ sở dữ liệu từ lược đồ, cuối cùng là khôi phục dữ liệu vào cơ sở dữ liệu mới tạo.
Tôi không nghĩ rằng bạn có thể làm hiện tại: hãy xem bài viết này trên trang wiki Postgresql .
Ba cách giải quyết từ bài viết này là:
Mở bảng trong PGAdmin và trong ngăn SQL ở dưới cùng, sao chép câu lệnh SQL Create Table. Sau đó, mở Công cụ truy vấn và dán. Nếu bảng có dữ liệu, hãy đổi tên bảng thành 'new_name', nếu không, hãy xóa chú thích "-" trong dòng Drop Table. Chỉnh sửa trình tự cột theo yêu cầu. Lưu ý dấu phẩy bị thiếu / thừa ở cột cuối cùng trong trường hợp bạn đã di chuyển nó. Thực thi lệnh SQL Create Table mới. Làm mới và ... voilà.
Đối với các bàn trống trong giai đoạn thiết kế, phương pháp này khá thực tế.
Trong trường hợp bảng có dữ liệu, chúng ta cũng cần sắp xếp lại trình tự cột của dữ liệu. Điều này rất dễ dàng: sử dụng INSERT
để nhập bảng cũ vào phiên bản mới của nó với:
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
... nơi c2
, c3
, c1
là các cột c1
, c2
, c3
của bảng cũ ở các vị trí mới của họ. Xin lưu ý rằng trong trường hợp này, bạn phải sử dụng tên 'mới' cho bảng 'cũ' đã chỉnh sửa, nếu không bạn sẽ mất dữ liệu của mình . Trong trường hợp tên cột nhiều, dài và / hoặc phức tạp, hãy sử dụng phương pháp tương tự như trên để sao chép cấu trúc bảng mới vào trình soạn thảo văn bản và tạo danh sách cột mới ở đó trước khi sao chép vào INSERT
câu lệnh.
Sau khi kiểm tra tất cả đều ổn, bạn hãy DROP
sử dụng bảng cũ và thay đổi tên 'mới' thành 'cũ' ALTER TABLE new RENAME TO old;
là xong.
Tôi đang làm việc để sắp xếp lại rất nhiều bảng và không muốn phải viết đi viết lại các truy vấn giống nhau nên tôi đã tạo một kịch bản để làm tất cả cho tôi. Về cơ bản, nó:
pg_dump
pg_dump
truy vấn ban đầu để tạo bảng được sắp xếp lại với dữ liệuNó có thể được sử dụng bằng cách chạy lệnh đơn giản sau:
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
Nó in ra sql để bạn có thể xác minh và kiểm tra nó, đó là lý do lớn mà tôi dựa vào nó pg_dump
. Bạn có thể tìm thấy repo github tại đây .
Tôi sử dụng Django và nó yêu cầu cột id trong mỗi bảng nếu bạn không muốn đau đầu. Thật không may, tôi đã bất cẩn và bảng bp.geo_location_vague của tôi không chứa trường này. Tôi đã viết tắt một mẹo nhỏ. Bước 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
Bước 2: (không tạo bảng - bảng sẽ tạo tự động!)
SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw
Bước 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;
Bởi vì tôi cần phải có bút danh bigserial trong bảng. Sau khi SELECT * vào pg sẽ tạo ra kiểu bigint insetad bigserial.
Bước 4: Bây giờ chúng ta có thể bỏ chế độ xem, bỏ bảng nguồn và đổi tên bảng mới theo tên cũ. Thủ thuật đã được kết thúc thành công.
Có một số giải pháp thay thế để làm cho nó khả thi:
Tạo lại toàn bộ bảng
Tạo các cột mới trong bảng hiện tại
Tạo chế độ xem