Phiên bản được hỗ trợ:hiện tại(17)16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

63.5. Chỉ kèo bóng đá c1 kiểm tra tính duy nhất#

PostgreSQLThực thi các ràng buộc duy nhất SQL bằng cách sử dụngChỉ kèo bóng đá c1 duy nhất, là các chỉ kèo bóng đá c1 không cho phép nhiều kèo bóng đá c1 với các khóa giống hệt nhau. Phương thức truy cập hỗ trợ các bộ tính năng nàyAmcanuniqueĐúng. (Hiện tại, chỉ có B-Tree hỗ trợ nó.) Các cột được liệt kê trongBao gồmmệnh đề không được xem xét khi thực thi tính duy nhất.

Do MVCC, luôn luôn cần phải cho phép các kèo bóng đá c1 trùng lặp tồn tại về mặt vật lý trong một chỉ kèo bóng đá c1: các kèo bóng đá c1 có thể đề cập đến các phiên bản liên tiếp của một hàng logic. Hành vi mà chúng tôi thực sự muốn thực thi là không có ảnh chụp nhanh MVCC nào có thể bao gồm hai hàng có khóa chỉ kèo bóng đá c1 bằng nhau.

  • Nếu một hàng hợp lệ mâu thuẫn đã bị xóa bởi giao dịch hiện tại, thì không sao. .

  • Nếu một hàng mâu thuẫn đã được chèn bởi một giao dịch chưa cam kết, thì người sẽ phải chờ xem giao dịch đó có cam kết không. Nếu nó quay trở lại thì không có xung đột.

  • Tương tự, nếu một hàng hợp lệ mâu thuẫn đã bị xóa bởi một giao dịch chưa được cam kết, thì người sẽ phải chờ giao dịch đó để thực hiện hoặc hủy bỏ, sau đó lặp lại thử nghiệm.

Hơn nữa, ngay trước khi báo cáo vi phạm tính độc đáo Theo các quy tắc trên, phương thức truy cập phải kiểm kèo bóng đá c1 lại khả năng sống của hàng được chèn. Nếu nó được cam kết đã chết thì không có vi phạm nên được báo cáo.Tạo chỉ kèo bóng đá c1 duy nhất đồng thời, tuy nhiên.)

Chúng tôi yêu cầu phương thức truy cập chỉ kèo bóng đá c1 để áp dụng các thử nghiệm này, điều đó có nghĩa là nó phải tiếp cận với đống để kiểm tra trạng thái cam kết của bất kỳ hàng nào được hiển thị có khóa trùng lặp theo nội dung chỉ kèo bóng đá c1. Điều này chắc chắn là xấu xí và không mô-đun, nhưng nó tiết kiệm công việc dư thừa: nếu chúng tôi thực hiện một đầu dò riêng thì việc tra cứu chỉ kèo bóng đá c1 cho một hàng mâu thuẫn về cơ bản sẽ được lặp lại trong khi tìm nơi chèn kèo bóng đá c1 chỉ kèo bóng đá c1 mới của hàng.

Nếu ràng buộc duy nhất là có thể trì hoãn, có sự phức tạp bổ sung: Chúng ta cần có khả năng chèn một kèo bóng đá c1 nhập chỉ kèo bóng đá c1 cho một hàng mới, nhưng trì hoãn mọi lỗi vi phạm độc đáo cho đến khi kết thúc câu lệnh hoặc thậm chí sau này. Để tránh các tìm kiếm lặp lại không cần thiết của chỉ kèo bóng đá c1, phương pháp truy cập chỉ kèo bóng đá c1 sẽ thực hiện kiểm tra tính duy nhất sơ bộ trong quá trình chèn ban đầu.MạnhLivethực tế có nghĩa làHồiBất kỳ tuple nào trong chuỗi nóng của kèo bóng đá c1 chỉ kèo bóng đá c1 là trực tiếp.) Để thực hiện điều này,AminsertHàm được truyền ACheckuniqueTham số có một trong các giá trị sau:

  • độc đáo_check_nochỉ ra rằng không nên kiểm tra tính duy nhất (đây không phải là một chỉ kèo bóng đá c1 duy nhất).

  • độc đáo_check_yesCho biết đây là một chỉ số duy nhất không thể hủy bỏ và kiểm kèo bóng đá c1 tính duy nhất phải được thực hiện ngay lập tức, như được mô tả ở trên.

  • độc đáo_check_partialchỉ ra rằng ràng buộc duy nhất là có thể trì hoãn.PostgreSQLSẽ sử dụng chế độ này để chèn vào kèo bóng đá c1 nhập chỉ kèo bóng đá c1 của mỗi hàng. Phương thức truy cập phải cho phép các kèo bóng đá c1 trùng lặp vào chỉ kèo bóng đá c1 và báo cáo bất kỳ bản sao tiềm năng nào bằng cách trả về false từAminsert. Đối với mỗi hàng giả được trả lại, một lần kiểm kèo bóng đá c1 lại sẽ được lên lịch.

    Phương thức truy cập phải xác định bất kỳ hàng nào có thể vi phạm ràng buộc duy nhất, nhưng đó không phải là lỗi để báo cáo các dương tính giả. Điều này cho phép kiểm kèo bóng đá c1 được thực hiện mà không cần chờ các giao dịch khác kết thúc;

  • độc đáo_check_existingchỉ ra rằng đây là một việc kiểm kèo bóng đá c1 lại một hàng được báo cáo là vi phạm độc đáo tiềm năng. Mặc dù điều này được thực hiện bằng cách gọiAminsert, Phương thức truy cập phảikhôngChèn một kèo bóng đá c1 nhập chỉ kèo bóng đá c1 mới trong trường hợp này. kèo bóng đá c1 nhập chỉ kèo bóng đá c1 đã có mặt.

    khuyến nghị rằng trong Ađộc đáo_check_existingGọi, phương thức truy cập xác minh thêm rằng hàng kèo bóng đá c1 tiêu thực sự có một kèo bóng đá c1 nhập hiện có trong chỉ kèo bóng đá c1 và lỗi báo cáo nếu không. Đây là một ý tưởng tốt bởi vì các giá trị Tuple Index được chuyển choAminsertsẽ được tính toán lại. Nếu định nghĩa chỉ số liên quan đến các chức năng không thực sự bất biến, chúng ta có thể kiểm tra sai khu vực của chỉ kèo bóng đá c1.