2011-01-12 30 views
6

Khi tôi xóa tất cả các bản ghi từ một bảng PostgreSQL và sau đó cố gắng để thiết lập lại trình tự để bắt đầu một kỷ lục mới với số 1 khi nó được đưa vào, tôi nhận được kết quả khác nhau:chuỗi PostgreSQL

SELECT setval('tblname_id_seq', (SELECT COALESCE(MAX(id),1) FROM tblname)); 

này đặt hiện tại giá trị của chuỗi là 1, nhưng bản ghi TIẾP THEO (thực ra là bản ghi đầu tiên vì không có bản ghi nào) được số 2!

Và tôi không thể đặt thành 0, vì giá trị tối thiểu trong chuỗi là 1!

Khi tôi sử dụng:

ALTER SEQUENCE tblname_id_seq RESTART WITH 1; 

kỷ lục đầu tiên được chèn thực sự được số 1! Nhưng mã trên không chấp nhận giá trị SELECT thay vì 1.

Tôi muốn đặt lại chuỗi thành số 1 khi không có bản ghi và bản ghi đầu tiên sẽ bắt đầu bằng 1. Nhưng khi có đã ghi lại trong bảng, tôi muốn đặt lại chuỗi để bản ghi tiếp theo được chèn vào sẽ nhận được {cao} +1

Có ai có giải pháp rõ ràng cho việc này không?

Trả lời

10

Sử dụng biểu mẫu ba đối số setval để đặt cờ is_called thành sai, sao cho nó trả về giá trị hiện tại của chuỗi cho cuộc gọi nextval tiếp theo thay vì tạo ngay một chuỗi mới.

http://www.postgresql.org/docs/current/interactive/functions-sequence.html

Cũng lưu ý bạn cần phải sử dụng COALESCE(MAX(id),0)+1, nếu không giá trị đầu tiên từ chuỗi sẽ MAX(id), mà bạn biết để tồn tại. (thx Stephen Denne)

+2

Và sử dụng 'COALESCE (MAX (id), 0) + 1' –

+0

Có, nếu không id tiếp theo sẽ va chạm với MAX (id). – araqnid

+0

Tuyệt vời nó hoạt động ngay bây giờ, thanx .... Tôi đã nhìn vào thông số đó, nhưng nó không hoạt động khi tôi thử nó. Tôi phải làm điều gì sai ... – Dylan

2

Xem http://www.postgresql.org/docs/current/static/functions-sequence.html, gần cuối trang.

Cụ thể, ít nhất trong Postgresql 9.0, bạn có thể tìm và đặt giá trị của chuỗi. Bạn có thể sử dụng hình thức ba đối số là setval() để đặt giá trị hiện tại của chuỗi hoặc giá trị tiếp theo của chuỗi (cho phép bạn đặt chuỗi thành 1 trên lần truy lục giá trị tiếp theo).

+0

hah, cách nhau 1 giây – araqnid

Các vấn đề liên quan