2008-09-29 23 views
11

Trong SQL, làm cách nào để cập nhật bảng, đặt cột thành một giá trị khác cho mỗi hàng?Làm thế nào để cập nhật các giá trị duy nhất trong SQL bằng cách sử dụng một trình tự PostgreSQL?

Tôi muốn cập nhật một số hàng trong cơ sở dữ liệu PostgreSQL, đặt một cột thành một số từ một chuỗi, trong đó cột đó có một ràng buộc duy nhất. Tôi hy vọng rằng tôi chỉ có thể sử dụng:

update person set unique_number = (select nextval('number_sequence')); 

nhưng có vẻ như NEXTVAL chỉ được gọi một lần, vì vậy việc cập nhật sử dụng cùng một số cho mỗi hàng, và tôi nhận được một 'khóa trùng lặp vi phạm hạn chế duy nhất' lỗi . Tôi nên làm gì?

Trả lời

28

Không sử dụng một subselect, thay vì sử dụng chức năng NEXTVAL trực tiếp, như thế này:

update person set unique_number = nextval('number_sequence'); 
+0

Cảm ơn - điều đó hoạt động. Tôi đã bị bắt bởi sub-select bởi vì tôi đã cố gắng sử dụng cùng một số thứ tự cho hai cột, nhưng tôi không thực sự cần phải làm điều đó. –

+0

Nếu bạn muốn sử dụng lại cùng một giá trị chuỗi sau khi bạn đã gọi nextval ('sequence'), bạn có thể sử dụng dòng hàm liên quan ('sequence'), trả về chuỗi hiện tại. – cms

0

tôi xem xét trình tự pg của một hack và dấu hiệu cho thấy các số nguyên gia tăng không phải là cách tốt nhất để hàng chủ chốt. Mặc dù pgsql đã không nhận được hỗ trợ cho đến khi UUIDs 8,3

http://www.postgresql.org/docs/8.3/interactive/datatype-uuid.html

Những lợi ích của UUID là sự kết hợp gần như vô hạn, không giống như một số ngẫu nhiên mà sẽ nhấn một vụ va chạm một ngày.

+0

"Gần như vô hạn?" Các tài liệu nói rằng nó là một loại số nguyên 128-bit. Đó là rất nhiều, nhưng nó không phải là vô hạn, và nó gần như chắc chắn để va chạm trước khi tất cả 2^128 giá trị được sử dụng. Ngoài ra, ORM có thể sẽ phải chuyển đổi thành/từ các loại chuỗi để sử dụng. Không phải là một chiến thắng rõ ràng trong quan điểm của tôi. – wberry

+2

Tôi nghĩ rằng bạn theo ước tính lớn như thế nào 2^128 là, đi đọc về uuid trên Wikipedia. – TravisO

+0

Đó là chủ yếu là học tập, nhưng một trình tự Postgres có thể được chống va chạm nhiều hơn một UUID tùy thuộc vào cách nó được tạo ra. Mô-đun 'uuid' của Python sử dụng một thành phần ngẫu nhiên, nhưng ít hơn 128 bit ngẫu nhiên. Trình tự chỉ va chạm nếu chúng chu kỳ, số ngẫu nhiên va chạm ... ngẫu nhiên. – wberry

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