PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để thay đổi ID bảng từ nối tiếp sang danh tính?

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đẩy cơ sở dữ liệu SQLite sang Heroku bằng các lần nhấn?

  2. postgresql createdb và TẠO CƠ SỞ DỮ LIỆU mang lại một cơ sở dữ liệu không trống. cái gì cái nĩa?

  3. chức năng tổng hợp nhóm theo ngày trong postgresql

  4. Heroku:PG ::ConnectionBad:không thể kết nối với máy chủ:Kết nối bị từ chối

  5. Tính toán và tiết kiệm dung lượng trong PostgreSQL