2016-10-02 4 views
0

У меня есть это назначение для начала SQL Server для добавления внешних ключей в эти таблицы. Последнее ALTER TABLE команды всегда выдает ошибкуSQL Srver ошибка внешнего ключа

Там нет первичных или кандидатов ключей в ссылочной таблице «TCases», которые соответствуют списку столбцов реферирования ...

, и я действительно не могу понять почему он дает эту ошибку. Любое понимание очень ценится.

CREATE TABLE TCourtRooms 
(  intCourtRoomID    INTEGER   NOT NULL 
     ,strCourtRoomNumber   VARCHAR(50)  NOT NULL 
     ,strJudgeLastName   VARCHAR(50)  NOT NULL 
     ,strJudgeFirstName   VARCHAR(50)  NOT NULL 
     ,CONSTRAINT TCourtDockets_PK PRIMARY KEY (intCourtRoomID) 
) 

CREATE TABLE TCases 
(  intCourtRoomID    INTEGER   NOT NULL 
     ,intCaseIndex    INTEGER   NOT NULL  
     ,strCaseNumber    VARCHAR(50)  NOT NULL 
     ,strDescription    VARCHAR(50)  NOT NULL 
     ,CONSTRAINT TCases_PK PRIMARY KEY (intCourtRoomID, intCaseIndex) 
) 

CREATE TABLE TPersons 
(  intCourtRoomID    INTEGER   NOT NULL 
     ,intCaseIndex    INTEGER   NOT NULL 
     ,intPersonIndex    INTEGER   NOT NULL 
     ,strLastName    VARCHAR(50)  NOT NULL 
     ,strFirstName    VARCHAR(50)  NOT NULL 
     ,strPersonRole    VARCHAR(50)  NOT NULL  --Options are plaintiff or defendant 
     ,CONSTRAINT TPlaintiffs_PK PRIMARY KEY (intCourtRoomID, intCaseIndex, intPersonIndex) 
) 


CREATE TABLE TLawyers 
(  intLawyerID    INTEGER   NOT NULL 
     ,intCaseIndex    INTEGER   NOT NULL 
     ,intPersonIndex    INTEGER   NOT NULL 
     ,strLastName    VARCHAR(50)  NOT NULL 
     ,strFirstName    VARCHAR(50)  NOT NULL 
     ,strLawyerRole    VARCHAR(50)  NOT NULL --plaintiff or defendant 
     ,CONSTRAINT TLawyers_PK PRIMARY KEY (intLawyerID, intCaseIndex, intPersonIndex) 
     ,CONSTRAINT TLawyers_intLawyerID_strLawyerRole_UN UNIQUE (intLawyerID, strLawyerRole) 
) 

Задача 3.2 Определить и создать внешние ключи

-- Child     Parent   Column(s) 
-- -----     ------   --------- 
-- TCases     TCourtRooms  intCourtRoomID 
-- TPersons     TCases   intCourtRoomID, intCaseIndex 
-- TLawyers     TCourtRooms 



ALTER TABLE TCases 
    ADD CONSTRAINT TCases_TCourtRooms_FK 
    FOREIGN KEY (intCourtRoomID) REFERENCES TCourtRooms (intCourtRoomID) 

ALTER TABLE TPersons 
    ADD CONSTRAINT TPersons_TCases_FK 
    FOREIGN KEY (intCourtRoomID, intCaseIndex) REFERENCES TCases (intCourtRoomID, intCaseIndex) 

ALTER TABLE TLawyers 
    ADD CONSTRAINT TLawyers_TCases_FK 
    FOREIGN KEY (intCaseIndex) REFERENCES TCases (intCaseIndex)</code> 

ответ

2

Это первичный ключ для TCases:

CONSTRAINT TCases_PK PRIMARY KEY (intCourtRoomID, intCaseIndex) 

Это первичный ключ композитный, состоящий из двух частей. Вы должны включить оба ключа в декларации:

ALTER TABLE TLawyers 
    ADD CONSTRAINT TLawyers_TCases_FK 
    FOREIGN KEY (intCaseIndex) REFERENCES TCases (intCourtRoomId, intCaseIndex) 

Но, к сожалению, вы не можете, потому что поле TLawyers.intCourtRoomId не существует. Я не уверен, что вам следует делать:

  • Добавить поле в TLawyers.
  • Исправить определение первичного ключа, чтобы ссылаться только на один столбец.
  • Сделайте что-нибудь еще.

Но это ваша проблема.

Смежные вопросы