Đặt lại khóa chính PostgreSQL thành 1


82

Có cách nào để đặt lại khóa chính của bảng PostgreSQL để bắt đầu lại từ 1 trên một bảng đã được điền không?

Ngay bây giờ nó đang tạo ra các con số từ 1000000 trở lên. Tôi muốn tất cả đặt lại và bắt đầu thành 1, giữ nguyên tất cả dữ liệu hiện có của tôi.

Câu trả lời:


33

Xem tùy chọn tốt hơn tại đây: https://stackoverflow.com/a/5272164/5190

Các khóa chính tự động tăng (tức là các cột có kiểu dữ liệu serial primary key) được liên kết với một chuỗi . Bạn có thể đặt giá trị tiếp theo cho bất kỳ chuỗi nào bằng cách sử dụng setval(<seqname>, <next_value>)hàm. Lưu ý rằng để thực sự tự thực thi hàm, bạn cần sử dụng SELECT, như sau:SELECT setval(<seqname>, <next_value>)

Tên của chuỗi được tạo tự động khi sử dụng nối tiếp là <table>_<column>_seq


14
Bạn cần đặt "CHỌN" trước cuộc gọi, ví dụ:SELECT setval('table_id_seq', 10000)
Tom

4
Nếu tôi làm vậy SELECT setval('table_id_seq', 1), khi tôi chèn một bản ghi mới, id sẽ nhận giá trị 2, thay vì 1. Giải pháp của Paweł Gościcki hoạt động. (PostgreSQL 9.3)
hơi xanh

@bluish Có lẽ điều đã xảy ra là số thứ tự được tăng lên trước khi khóa chính mới được gán, tức là. bạn cần đặt lại nó thành 0. Nhưng tôi đồng ý rằng giải pháp khác vẫn tốt hơn.
kralyk

189

Cách tốt nhất để đặt lại trình tự bắt đầu lại với số 1 là thực hiện như sau:

ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1

Vì vậy, ví dụ đối với usersbảng nó sẽ là:

ALTER SEQUENCE users_id_seq RESTART WITH 1

21
Các WITH 1tham số là redundand và nó có thể được Bỏ qua phần
Jacek Krawczyk

Đó là câu trả lời đúng duy nhất vì nó thực sự thiết lập lại trình tự.
Balbinator

1
Các vấn đề lớn về chỉ số tạo ra tự động bởi CREATE TABLE khoản, là chúng ta không biết tên (và hậu tố không phải là seq, có thể bởi pkvv.) ... Nhưng nó rất dễ dàng bằng cách vào psql bằng \d my_table_name. Hoặc kiểm tra bằng SQL,SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
Peter Krauss

3

@bluish thực sự chèn một bản ghi mới bằng cách sử dụng khóa chính tự động tăng dần, giống như cách sử dụng một chuỗi rõ ràng theo cách này:

INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)

Vì vậy, nếu bạn muốn id đầu tiên là 1, bạn phải đặt chuỗi của mình thành 0. Nhưng nó nằm ngoài giới hạn, vì vậy bạn phải sử dụng câu lệnh ALTER SEQUECE. Vì vậy, nếu bạn có một trường sê-ri có tên là số trong menu bảng của mình, ví dụ:

ALTER SEQUENCE menu_number_seq RESTART

sẽ thực hiện công việc một cách hoàn hảo.

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.