17

テーブルに制約がありました


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

2 週間前に、テーブルを変更し、いくつかの列を追加し、制約 "PK_USERSAPPLICATIONS" を削除し、代理キーを追加しました。Oracle SQL Developer で、制約 PK_USERSAPPLICATIONS がもう存在しないことがわかります。

それにもかかわらず、同じ userid/applicationName の組み合わせで 2 つのエントリを追加しようとすると、エラーが発生します


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.

ステートメントを実行すると


SELECT *
FROM   user_cons_columns
WHERE  constraint_name = 'PK_USERSAPPLICATIONS' 

私はゼロ行を取得します。それはどうしてですか?制約 PK_USERSAPPLICATIONS はすでに数週間前に削除されているため、Oracle はこの制約について何の知識も持っていないはずです。また、データベースでも確認できません。

4

2 に答える 2

33

その制約で使用されたインデックスをまだ持っていますか? 制約を削除したときに句を含めない限りDROP INDEX、それはまだそこにあるからです。皮切りに

SELECT * 
FROM   user_indexes
WHERE  index_name = 'PK_USERSAPPLICATIONS'  
/

あるいは、

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

また

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

編集

コンセプトの証明

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>

したがって、制約が機能します。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>

エラー メッセージの微妙な変化に注意してください。2 番目のエラーはインデックス名を参照していますが、元のメッセージは制約を参照していました。インデックス名が制約名と同じ場合、これを診断するのは困難です。

一意のインデックスを明示的に事前に作成しない場合、Oracle のデフォルトの動作では、一意でないインデックスが作成されます。したがって、インデックスを削除せずに制約を削除しても、この問題は発生しません。(この動作は 11g にも当てはまります。以前のバージョンでもこのようになっていると推測しますが、確証はありません)。

于 2010-03-03T14:49:07.857 に答える
1

この列のインデックスを確認してください。制約の削除後、制約に関連付けられたインデックスが削除されない場合がある

于 2010-03-03T14:55:47.000 に答える