BEGIN;
ALTER TABLE public.client ALTER clientid DROP DEFAULT; -- drop default
DROP SEQUENCE public.client_clientid_seq; -- drop owned sequence
ALTER TABLE public.client
-- ALTER clientid SET DATA TYPE int, -- not needed: already int
ALTER clientid ADD GENERATED ALWAYS AS IDENTITY (RESTART 108);
COMMIT;
Có hai biến:
- tên thực của
SEQUENCE
được đính kèm . Tôi đã sử dụng tên mặc định ở trên, nhưng tên có thể khác. - giá trị tối đa hiện tại trong
client.clientid
. Không nhất thiết phải là 107, chỉ vì hiện tại có 107 hàng.
Truy vấn này nhận được cả hai:
SELECT pg_get_serial_sequence('client', 'clientid'), max(clientid) FROM client;
Một serial
cột là một số nguyên integer
cột sở hữu một chuỗi chuyên dụng và có bộ mặc định để vẽ từ nó (như có thể thấy từ định nghĩa bảng mà bạn đã đăng). Để biến nó thành integer
đơn giản , bỏ mặc định và sau đó bỏ trình tự.
Chuyển đổi cột thành IDENTITY
thêm trình tự của riêng nó. Bạn phải bỏ trình tự sở hữu cũ (hoặc ít nhất là quyền sở hữu, sẽ chết khi bỏ trình tự). Nếu không, bạn sẽ gặp các lỗi như:
Làm cách nào để sao chép cấu trúc và nội dung của bảng nhưng với trình tự riêng biệt?
Sau đó chuyển đổi integer
đơn giản thành một IDENTITY
và khởi động lại với giá trị tối đa hiện tại là cộng 1 . Bạn phải đặt giá trị hiện tại của chuỗi nội bộ mới để tránh các vi phạm duy nhất.
Kết hợp tất cả trong một giao dịch duy nhất, vì vậy bạn không bị rối tung nửa đường trong quá trình di chuyển. Tất cả các lệnh DDL này đều được giao dịch trong Postgres, có thể được khôi phục lại cho đến khi được cam kết và chỉ hiển thị với các giao dịch khác bắt đầu sau đó.
Cột của bạn đã PK trước đó và vẫn PK. Điều này trực quan với sự thay đổi.
Peter Eisentraut, tác giả chính của (mới trong Postgres 10) IDENTITY
, cũng được cung cấp một function upgrade_serial_to_identity()
để chuyển đổi serial
hiện có cột. Nó sử dụng lại trình tự hiện có và thay vào đó cập nhật trực tiếp danh mục hệ thống - điều mà bạn không nên tự làm trừ khi bạn biết chính xác mình đang làm gì. Nó cũng bao gồm các trường hợp góc kỳ lạ. Hãy khám phá (chương "Nâng cấp"):
Tuy nhiên, chức năng này sẽ không hoạt động trên hầu hết các dịch vụ được lưu trữ không cho phép thao tác trực tiếp các danh mục hệ thống. Sau đó, bạn quay lại các lệnh DDL như hướng dẫn ở trên cùng.
Có liên quan: