0

Candidateテーブルに複合主キーがあります

CREATE TABLE CANDIDATE(
CANDIDATE_ID VARCHAR(5),
NAME VARCHAR(30),
TELEPHONE NUMBER,
PRIMARY KEY(CANDIDATE_ID, NAME));

子テーブルを作成すると、CANDIDATE_ID の外部キーを作成するときに、参照する列の数が参照される列と一致する必要があるというエラーが表示されます

CREATE TABLE JOB(
POSITION_ID VARCHAR(5) PRIMARY KEY,
CANDIDATE_ID VARCHAR(5),
DATE2 DATE,
FOREIGN KEY(CANDIDATE_ID) REFERENCES CANDIDATE); 
4

4 に答える 4

4

テーブルは主キーを 1 つだけ持つことができます。複合主キーがあります。複合主キーがある場合は、子テーブルのキー全体を参照する必要があります。つまり、子テーブルにはCANDIDATE_ID列と列が必要NAMEです。

CREATE TABLE job (
  position_id VARCHAR2(5) PRIMARY KEY,
  candidate_id VARCHAR2(5),
  name         VARCHAR2(30),
  date2        DATE,
  FOREIGN KEY( candidate_id, name ) REFERENCES candidate( candidate_id, name )
);

もちろん、name両方のテーブルに を格納したくないでしょう。おそらく、candidate_idを の主キーにするcandidate必要があり、 に対して別の一意の制約を作成する必要がある場合がありますname

CREATE TABLE CANDIDATE(
  CANDIDATE_ID VARCHAR(5) primary key,
  NAME VARCHAR(30) unique,
  TELEPHONE NUMBER);

CREATE TABLE JOB(
  POSITION_ID VARCHAR(5) PRIMARY KEY,
  CANDIDATE_ID VARCHAR(5),
  DATE2 DATE,
  FOREIGN KEY(CANDIDATE_ID) REFERENCES CANDIDATE(candidate_id)); 
于 2012-05-07T18:40:21.233 に答える
1

キーを一意にするために CANDIDATE_ID と NAME の組み合わせが必要であると仮定すると、参照テーブルの NAME 列への参照を追加する必要があります。

プライマリ テーブル内の候補を一意に識別するには、CANDIDATE_ID で十分だと思います。その場合、それが主キーである必要があり、関係は機能します。NAME を個別にインデックス化したい場合はそうしますが、主キーには含めません。

于 2012-05-07T18:39:27.663 に答える
0

最後の行は次のようになります。

CONSTRAINT FK_CANDIDATE_ID FOREIGN KEY (CANDIDATE_ID)REFERENCES CANDIDATE(CANDIDATE_ID);

于 2012-05-07T18:37:51.360 に答える