2012-02-16 22 views
8

Tôi đã nhìn thấy các giải pháp để cập nhật một chuỗi khi nó không đồng bộ với khóa chính mà nó tạo ra, nhưng tôi không hiểu vấn đề này xảy ra như thế nào ngay từ đầu.Tại sao các chuỗi id SQL không đồng bộ (cụ thể là sử dụng Postgres)?

Có ai có thông tin chi tiết về trường khóa chính, được định nghĩa mặc định là tiếp theo của chuỗi không, có khóa chính không được đặt rõ ràng ở bất kỳ đâu, có thể không đồng bộ với chuỗi không? Tôi đang sử dụng Postgres và chúng tôi thấy điều này xảy ra ngay bây giờ và sau đó. Kết quả cuối cùng trong một ràng buộc khóa trùng lặp khi trình tự tạo ra một id cho một hàng hiện có.

+1

Sau một số nghiên cứu, trong trường hợp cụ thể của tôi nó thực sự là một bản đồ Hibernate đã tạo ra các ID riêng của nó và bỏ qua chuỗi. Không chắc chắn nếu tôi nên xóa câu hỏi trong trường hợp này - có vẻ như những người khác gặp phải vấn đề tương tự. – Jake

+2

Bạn chỉ có thể trả lời câu hỏi của riêng bạn. Có thực sự không có cách nào cho các chuỗi để đi "không đồng bộ" ngoại trừ nếu bạn (hoặc một số phần mềm trung gian) không sử dụng trình tự để tạo ra các khóa chính cho một số hoặc tất cả các hàng. – nos

Trả lời

8

Ứng dụng của bạn đôi khi có thể đặt giá trị cho khóa chính cho hàng mới. Sau đó, postgresql không cần phải nhận một chuỗi mới và chuỗi không được cập nhật.

+1

Điều này là chính xác - một ánh xạ ngủ đông đã bỏ qua trình tự, vì vậy khi một ứng dụng không ngủ đông chèn một hàng cho phép trình tự tạo ra id, trình tự đã lỗi thời. – Jake

0

Khi số thứ tự được cấp phát, nó vẫn được cấp phát, ngay cả khi TX yêu cầu được cuộn lại. Vì vậy, một số có thể được cấp phát không xuất hiện trong cơ sở dữ liệu ổn định. Tất nhiên, các hàng cũng có thể bị xóa sau khi chúng được tạo ra, vì vậy số lượng tối đa được tìm thấy trong bảng không cần phải là số lượng tối đa được phân bổ. Điều này áp dụng cho bất kỳ loại tăng tự động nào.

Ngoài ra, tùy thuộc vào công nghệ được sử dụng, các trình tự riêng biệt có thể được sử dụng với nhiều bảng, do đó giá trị có thể bị thiếu trong TableA nhưng có trong TableB. Đó có thể là do một sai lầm trong việc sử dụng tên chuỗi, hoặc nó có thể là cố ý.

+1

Đây không phải là câu trả lời cho câu hỏi này. – Tometzky

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