2010-03-03 25 views
13

Tôi đã có một hạn chế trong một bảngTìm ma chế từ Oracle DB


CREATE TABLE "USERSAPPLICATIONS" (
    "USERID" NUMBER NOT NULL , 
    "APPLICATIONNAME" VARCHAR2 (30) NOT NULL , 
CONSTRAINT "PK_USERSAPPLICATIONS" PRIMARY KEY ("USERID","APPLICATIONNAME") 
) 
/

Hai tuần trước, tôi sửa đổi bàn, bổ sung một số cột, xóa các hạn chế "PK_USERSAPPLICATIONS" và nói thêm một phím thay thế. Tôi có thể thấy trong Oracle SQL Developer rằng ràng buộc PK_USERSAPPLICATIONS không tồn tại nữa.

Bất kể rằng, khi tôi cố gắng thêm hai mục với sự kết hợp cùng userid/applicationName, tôi nhận được một lỗi


SQL Error: ORA-00001: unique constraint (ACCOUNTMP1.PK_USERSAPPLICATIONS) violated 
00001. 00000 - "unique constraint (%s.%s) violated" 
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key. 
      For Trusted Oracle configured in DBMS MAC mode, you may see 
      this message if a duplicate entry exists at a different level. 
*Action: Either remove the unique restriction or do not insert the key. 

Khi tôi thực hiện báo cáo kết quả


SELECT * 
FROM user_cons_columns 
WHERE constraint_name = 'PK_USERSAPPLICATIONS' 

tôi nhận zero hàng . Làm thế nào mà có thể được? Oracle không nên có bất kỳ kiến ​​thức nào về ràng buộc PK_USERSAPPLICATIONS vì nó đã bị xóa trước đó vài tuần và tôi cũng không thể thấy nó trong cơ sở dữ liệu.

Trả lời

30

Bạn vẫn có chỉ mục được sử dụng bởi ràng buộc đó? Bởi vì trừ khi bạn đã bao gồm mệnh đề DROP INDEX khi bạn bỏ ràng buộc, nó sẽ vẫn ở đó. Bắt đầu với

SELECT * 
FROM user_indexes 
WHERE index_name = 'PK_USERSAPPLICATIONS' 
/

Ngoài ra,

select index_name 
from user_indexes 
where table_name = 'USERSAPPLICATIONS' 
and uniqueness='UNIQUE' 
/

hoặc

select index_name 
from user_ind_columns 
where table_name = 'USERSAPPLICATIONS' 
and column_name in ('USERID' ,'APPLICATIONNAME') 
/

chỉnh sửa

Bằng chứng về khái niệm

SQL> create table t23 (id number not null, alt_key varchar2(10) not null) 
    2/

Table created. 

SQL> create unique index t23_idx on t23 (id) 
    2/

Index created. 

SQL> alter table t23 add constraint t23_pk primary key (id) using index 
    2/

Table altered. 

SQL> insert into t23 values (1, 'SAM I AM') 
    2/

1 row created. 

SQL> insert into t23 values (1, 'MR KNOX') 
    2/
insert into t23 values (1, 'MR KNOX') 
* 
ERROR at line 1: 
ORA-00001: unique constraint (APC.T23_PK) violated 

SQL> 

Vì vậy, ràng buộc hoạt động. Điều gì sẽ xảy ra nếu chúng ta thả nó, mà không có mệnh đề DROP INDEX?

SQL> alter table t23 drop constraint t23_pk 
    2/

Table altered. 

SQL> insert into t23 values (1, 'MR KNOX') 
    2/
insert into t23 values (1, 'MR KNOX') 
* 
ERROR at line 1: 
ORA-00001: unique constraint (APC.T23_IDX) violated 


SQL> 

Lưu ý sự thay đổi tinh tế trong thông báo lỗi. Lỗi thứ hai tham chiếu đến tên chỉ mục, trong khi thông báo ban đầu tham chiếu đến ràng buộc. Nếu tên chỉ mục giống như tên ràng buộc, thật khó để chẩn đoán điều này.

Nếu bạn không rõ ràng trước khi tạo chỉ mục duy nhất hành vi mặc định của Oracle là tạo ra một chỉ mục không duy nhất. Do đó, việc giảm ràng buộc mà không làm giảm chỉ mục không gây ra vấn đề này. (Caveat hành vi này là đúng của 11g. Tôi đoán - nhưng không thể chắc chắn - rằng nó cũng là cách này trong các phiên bản trước đó).

+0

+1. Tại chỗ trên. Không bao giờ nghĩ theo cách đó. – Guru

+0

Câu trả lời rất hay và kỹ lưỡng. Đó là nó - ngớ ngẩn chỉ số được đặt tên chính xác như ràng buộc trong trường hợp của tôi. – simon

+0

Cảm ơn bạn. Sau khi tìm thấy chỉ mục, tôi thả nó bằng một kịch bản khác DROP INDEX PK_USERSAPPLICATIONS; – Coisox

1

Hãy thử kiểm tra chỉ mục cho các cột này. Trong một số trường hợp, chỉ mục liên kết với ràng buộc không bị giảm sau khi hạn chế xóa

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