Một ràng buộc và một chỉ mục là các thực thể logic riêng biệt. Ví dụ:một ràng buộc duy nhất hiển thị trong USER_CONSTRAINTS
(hoặc ALL_CONSTRAINTS
hoặc DBA_CONSTRAINTS
). Chỉ mục hiển thị trong USER_INDEXES
(hoặc ALL_INDEXES
hoặc DBA_INDEXES
).
Một ràng buộc duy nhất được thực thi bởi một chỉ mục mặc dù có thể (và đôi khi cần thiết) để thực thi một ràng buộc duy nhất bằng cách sử dụng một chỉ mục không phải duy nhất. Ví dụ, một ràng buộc duy nhất có thể hoãn lại được thực thi bằng cách sử dụng một chỉ mục không phải là duy nhất. Nếu bạn tạo một chỉ mục không phải duy nhất trên một cột và sau đó tạo một ràng buộc duy nhất, bạn cũng có thể sử dụng chỉ mục không duy nhất đó để thực thi ràng buộc duy nhất.
Trong thực tế, một chỉ mục duy nhất hoạt động rất giống một ràng buộc duy nhất, không thể hoãn lại ở chỗ nó gây ra cùng một lỗi mà một ràng buộc duy nhất gây ra vì việc triển khai các ràng buộc duy nhất sử dụng chỉ mục. Nhưng nó không hoàn toàn giống nhau vì không có sự ràng buộc nào cả. Vì vậy, như bạn đã thấy, không có ràng buộc duy nhất nên bạn không thể tạo ràng buộc khóa ngoại tham chiếu đến cột.
Có những trường hợp bạn có thể tạo một chỉ mục duy nhất mà bạn không thể tạo một ràng buộc duy nhất. Ví dụ:một chỉ mục dựa trên hàm thực thi tính duy nhất có điều kiện. Nếu tôi muốn tạo một bảng hỗ trợ xóa logic nhưng đảm bảo rằng COL1
là duy nhất cho tất cả các hàng không bị xóa
SQL> ed
Wrote file afiedt.buf
1 CREATE TABLE t (
2 col1 number,
3 deleted_flag varchar2(1) check( deleted_flag in ('Y','N') )
4* )
SQL> /
Table created.
SQL> create unique index idx_non_deleted
2 on t( case when deleted_flag = 'N' then col1 else null end);
Index created.
SQL> insert into t values( 1, 'N' );
1 row created.
SQL> insert into t values( 1, 'N' );
insert into t values( 1, 'N' )
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.IDX_NON_DELETED) violated
SQL> insert into t values( 1, 'Y' );
1 row created.
SQL> insert into t values( 1, 'Y' );
1 row created.
Nhưng nếu chúng ta đang nói về một chỉ mục không dựa trên chức năng duy nhất, có lẽ tương đối ít trường hợp tạo chỉ mục thực sự có ý nghĩa hơn là tạo ràng buộc. Mặt khác, có tương đối ít trường hợp nó tạo ra nhiều khác biệt trong thực tế. Bạn hầu như không bao giờ muốn khai báo một ràng buộc khóa ngoại tham chiếu đến một ràng buộc duy nhất chứ không phải là một ràng buộc khóa chính, vì vậy bạn hiếm khi mất thứ gì đó bằng cách chỉ tạo chỉ mục và không tạo ràng buộc.