2013-03-20 40 views
6

Trong trường hợp giả định, tôi là người dùng không có đặc quyền tạo bảng. Tôi muốn biết liệu một cột trong một bảng có UNIQUE CONSTRAINT hay không. Có thể tra cứu nó trong DICTIONARY không? Làm thế nào tôi sẽ đi về nó?Tìm xem cột có ràng buộc duy nhất

Trả lời

5

Cả hai câu trả lời được đưa ra ở đây đều thiếu một cách để thực thi tính duy nhất trên cột: bằng cách tạo một chỉ số duy nhất (không xác định ràng buộc duy nhất trên cột). Xem hai liên kết này (one, two) nếu bạn không quen với tùy chọn này.

kiểm tra này nên được thực hiện thêm để kiểm tra hạn chế duy nhất:

select count(*) from 
USER_IND_COLUMNS cols 
where cols.table_name='YOUR_TABLE_NAME' 
and cols.COLUMN_NAME='YOUR_COLUMN'; 

Để kiểm tra cho một hạn chế duy nhất sử dụng phương pháp đã được cung cấp:

select count(*) cnt 
from user_constraints uc 
where uc.table_name='YOUR_TABLE_NAME' 
and uc.constraint_type='U'; 

Hoặc bạn cũng có thể tìm trong các chế độ xem ALL_CONSTRAINTSALL_IND_COLUMNS.

5

cho ràng buộc duy nhất bạn có thể làm một cái gì đó như:

select cons.constraint_type, 
     all_cols.owner, all_cols.constraint_name, 
     all_cols.table_name, 
     all_cols.column_name, 
     all_cols.position 
    from all_cons_columns col 
     inner join all_cons_columns all_cols 
       on col.owner = all_cols.owner 
       and col.constraint_name = all_cols.constraint_name 
     inner join all_constraints cons 
       on col.owner = cons.owner 
       and col.constraint_name = cons.constraint_name 
where col.owner = 'SCHEMA' 
    and col.table_name = 'FOO' 
    and col.column_name = 'ID' 
    and cons.constraint_type in ('U', 'P') 
order by owner, constraint_name, position; 

thiết lập các chủ sở hữu, bảng và cột quan tâm và nó sẽ hiển thị cho bạn tất cả những hạn chế đó bao gồm cột đó

Lưu ý rằng điều này sẽ không hiển thị tất cả các trường hợp trong đó một chỉ mục duy nhất tồn tại trên một cột (vì có thể có một chỉ mục duy nhất tại chỗ mà không có ràng buộc).

dụ:

SQL> create table foo(id number, id2 number, constraint foo_con unique(id, id2), constraint foo_con2 unique(id)); 

Table created. 

tại liệt kê tất cả những hạn chế đó bao gồm id:

SQL> col column_name format a20 
SQL> col constraint_name format a20 
SQL> col table_name format a15 
SQL> select cons.constraint_type, 
    2   all_cols.owner, all_cols.constraint_name, 
    3   all_cols.table_name, 
    4   all_cols.column_name, 
    5   all_cols.position 
    6 from all_cons_columns col 
    7   inner join all_cons_columns all_cols 
    8     on col.owner = all_cols.owner 
    9    and col.constraint_name = all_cols.constraint_name 
10   inner join all_constraints cons 
11     on col.owner = cons.owner 
12    and col.constraint_name = cons.constraint_name 
13 where col.owner = user 
14  and col.table_name = 'FOO' 
15  and col.column_name = 'ID' 
16  and cons.constraint_type in ('U', 'P') 
17 order by owner, constraint_name, position; 

C OWNER       CONSTRAINT_NAME  TABLE_NAME  COLUMN_NAME   POSITION 
- ------------------------------ -------------------- --------------- -------------------- ---------- 
U DTD_TRADE      FOO_CON    FOO    ID       1 
U DTD_TRADE      FOO_CON    FOO    ID2       2 
U DTD_TRADE      FOO_CON2    FOO    ID       1 
+0

Câu trả lời này không kiểm tra các chỉ mục duy nhất - xem câu trả lời của tôi để biết chi tiết;). – SebastianH

3
select count(*) cnt 
from user_constraints 
where table_name=your_table_name 
and constraint_type='U'; 

Nếu count = 0 thì không có UNIQUE hạn chế khác có UNIQUE hạn chế trên bàn của bạn.

+0

Câu trả lời này không kiểm tra các chỉ mục duy nhất - xem câu trả lời của tôi để biết chi tiết;) – SebastianH

0

Đây là truy vấn mà tôi vừa thử. Nó liệt kê mỗi hạn chế tính độc đáo, xác định bởi chỉ số mà thực thi nó, và các cột là duy nhất:

select x.index_name, c.column_name, c.column_position 
from USER_INDEXES x join USER_IND_COLUMNS c 
    on x.index_name = c.index_name and x.table_name = c.table_name 
    left join USER_CONSTRAINTS uc 
    on x.index_name = uc.index_name and x.table_name = uc.table_name 
where x.status = 'VALID' and 
     (x.uniqueness = 'UNIQUE' or 
     uc.constraint_type = 'U' and uc.status = 'ENABLED' and uc.validated = 'VALIDATED') 
     and x.table_name='<your table name_in_caps>' 
order by x.index_name, c.column_position; 

Có vẻ như để làm việc cho khóa chính, chỉ số duy nhất, và thêm ràng buộc duy nhất.

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