ORA-02264: 名前はすでに既存の制約によって使用されています。

SQLで作業しているのですが、テーブルの作成で問題に直面しています! 以下は私のコードです。

CREATE TABLE Voucher_Types
(
    ID Number(3, 0),
    Abbreviation VarChar(2),
    Voucher_Type VarChar(100),
    EntryBy VarChar(25),
    EntryDate Date,
    CONSTRAINT ID_PK Primary Key(ID)
);

というエラーが出ています。 ORA-02264: name already used by an existing constraint<br /&gt.私はOracle10gを使用しています。 Oracle10g<br /&gt.を使用しています。 このような場合、どのようにすればよいのでしょうか?って感じです。

ソリューション

ID_PK`という名前ですでに制約されている別のテーブルがあります。

それがどのテーブルなのか知りたい場合は、次のようにしてください。

select owner, table_name from dba_constraints where constraint_name = 'ID_PK';

おそらく、create table ステートメントをコピーしましたが、主キー'制約の名前を変更していません。

一般的に、制約の名前にテーブル名を含めることは良い習慣であると考えられています。その理由の1つは、まさにこのようなエラーを防ぐためです。

ですから、あなたのケースでは、次のように使用します。

CREATE TABLE Voucher_Types
(
   ... 
   CONSTRAINT Voucher_Types_PK Primary Key(ID)
);

更新 同じ制約名を2回使用することはできないのでしょうか?(コメントでのご質問の通りです)。これはまさに、制約を識別するための名前であるためです。実行中のシステムで制約の違反があった場合、それがどの制約であったかを知りたいので、名前が必要です。しかし、この名前が複数の制約を参照できるのであれば、名前は特に意味がない。

解説 (2)

エラーメッセージは、スキーマにID_PKという名前の別の制約がすでに存在することを伝えています。

CREATE TABLE Voucher_Types
(
    ID Number(3, 0),
    Abbreviation VarChar(2),
    Voucher_Type VarChar(100),
    EntryBy VarChar(25),
    EntryDate Date,
    CONSTRAINT VOUCHER_TYPES_ID_PK Primary Key(ID)
);

問題の制約を見つけるには

SELECT * FROM user_constraints WHERE CONSTRAINT_NAME = 'ID_PK'
解説 (0)

これは、ID_PKという制約があることを意味します。 CONSTRAINT Voucher_Types_ID_PK Primary Key(ID)` 例えば、以下のようにします。

で存在するかどうか確認できます。

select * from user_constraints where upper(constraint_name) = 'ID_PK';

または

select * from all_constraints where upper(constraint_name) = 'ID_PK';
解説 (0)