Thay đổi cột hiện có trong PG thành khóa chính tăng tự động


11

Tôi có một cơ sở dữ liệu trong Postgresql, được di chuyển từ SQL Server (chỉ dữ liệu).
Trên SQL Server, một bảng từ cơ sở dữ liệu này có các cột sau:

measure_id
datum
measure

trong đó measure_idkhóa chính tăng tự động, datumlà datetime và measurelà float.
Sau khi di chuyển trong Postrgresql, measure_idlà cột kiểu bigint.

Làm cách nào tôi có thể thay đổi cột này ( measure_id) thành bigserial và gán nó làm khóa chính, bây giờ bảng của tôi chứa đầy dữ liệu?

Câu trả lời:


16

Tạo một chuỗi và sử dụng nó làm giá trị mặc định cho cột:

create sequence measures_measure_id_seq
   owned by measures.measure_id;

alter table measures
   alter column measure_id set default nextval('measures_measure_id_seq');

commit;

Đó thực chất là những gì serial.

Xem hướng dẫn để biết chi tiết:
http://www.postgresql.org/docs/civerse/static/datatype-numeric.html#DATATYPE-SERIAL


Được rồi cảm ơn. Bạn có thể chỉ cần bỏ một ghi chú những gì owned by measures.measure_idlàm?
zetah

@zetah: Trích dẫn từ hướng dẫn sử dụng (liên kết tôi đã thêm): " chuỗi được đánh dấu là" thuộc sở hữu "của cột, do đó nó sẽ bị hủy nếu cột hoặc bảng bị hủy "
a_horse_with_no_name

2
À, đúng rồi, nó giống như một vật trang trí. Tôi đã đề cập rằng bảng đã có dữ liệu, nhưng chuỗi mới được tạo sẽ không tôn trọng dữ liệu đã có và sẽ bắt đầu đếm từ 1, sẽ báo lỗi khi chèn mới đầu tiên cho ràng buộc duy nhất. Vì vậy, nếu bất cứ ai khác đang đọc điều này thì sẽ đúng hơn khi sử dụng CREATE SEQUENCE seq START WITH xx ở hàng cuối cùng ( SELECT MAX(measure_id)+1 FROM measurestrong trường hợp của tôi)
zetah

1
@zetah Cảm ơn bản cập nhật này. Làm thế nào bạn sẽ viết một truy vấn trong trường hợp đó? Tôi đã thử CREATE SEQUENCE seq START WITH (SELECT MAX(measure_id)+1 FROM measures); nhưng điều này dường như không phải là cách chính xác.
tò mò

Những gì bạn đang cố gắng làm là: chọn setval ('SequX', (chọn max (table_id) +1 từ bảng), false) Tìm thấy ở đây: stackoverflow.com/questions/2022559/iêu
HydrUra
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.