1

既存のテーブルに新しい外部キーを追加するのはそれほど難しいことではないので、私は信じられないほど愚かなことをしているに違いないと確信しています。しかし、私はまだ立ち往生しています。これが私がしていることです。

TPM_USERまず、ユーザーが所属するチームを保存するために、に新しい列を作成しました。

ALTER TABLE TPM_USER ADD (
  "TEAMID" NUMBER NULL
)

これはエラーなしで機能し、TPM_USERテーブルをクエリして新しい列が追加されたことを確認できます。次に、TEAMIDが既存のTPM_DEVELOPMENTTEAMSテーブルの行を参照するようにします。私もです:

ALTER TABLE TPM_USER
    ADD CONSTRAINT TPM_USER_FK1
    FOREIGN KEY(TEAMID)
    REFERENCES TPM_DEVELOPMENTTEAMS(TEAMID)

これは私にエラーを与えます:

ORA-02270:この列リストに一致する一意キーまたは主キーがありません

両方のTEAMID列が同じデータ型(NUMBER)であり、TEAMIDがDEVELOPMENTTEAMSテーブルの主キーであることを確認しました。実際、次のスキーマは次のDEVELOPMENTTEAMSとおりです。

CREATE TABLE TPMDBO.TPM_DEVELOPMENTTEAMS  ( 
    TEAMID      NUMBER NULL,
    NAME        VARCHAR2(100) NOT NULL,
    ISACTIVE    CHAR(1) NULL,
    SORTORDER   NUMBER NULL,
    SHORTNAME   VARCHAR2(100) NULL,
    GROUPID     NUMBER NOT NULL,
    CONSTRAINT TPM_DEVELOPMENTTEAMS_PK PRIMARY KEY(TEAMID)
    NOT DEFERRABLE
     DISABLE NOVALIDATE
)

Aqua Data StudioのGUIインターフェイスを試して、新しい制約も追加したので、スペルを間違えたことはないと確信しています。私は何が間違っているのですか?

4

2 に答える 2

4

PKが無効になっています。次のコマンドで有効にします。

ALTER TABLE TPM_DEVELOPMENTTEAMS ENABLE CONSTRAINT TPM_DEVELOPMENTTEAMS_PK;

ところで、それをPKと宣言することによって、あなたはTPM_DEVELOPMENTTEAMS.TEAMID非NULLも作成しました(したがって、その後にNULLの目的はありません)。

于 2012-05-14T17:12:49.253 に答える
0

同じ/他のテーブルで主キーまたは一意キーが有効になっている列(または列の組み合わせ)のみを参照できます。

以下のクエリで制約が無効になっている場合は、そのPK/UKの外部キーを作成できません。有効にする必要があります。

select constraint_name from dba_constraints
   where constraint_type in ('P','U')
   and status = 'DISABLED'
   and lower(table_name) = lower(:p_table_name);
于 2017-11-10T09:25:50.210 に答える