SQL ORA-02256: количество ссылочных столбцов должно соответствовать ссылочным столбцам

это мои таблицы:

CREATE TABLE EMPLOYEE(
    Emp_id number(4),
    Emp_name varchar2(30),
    Emp_gender varchar2(1),
    Status varchar2(30),
    Years_service number(4),
    Primary Key (emp_id)
);

CREATE TABLE ACTIVITY(
    Act_id number(4),
    Description varchar2(30),
    Category_code varchar2(1),
    Primary Key(Act_id)
);

CREATE TABLE ALLOCATION(
    Emp_id number(4) NOT NULL,
    Act_id number(4) NOT NULL,
    Hourly_rate number(5,2) NOT NULL,
    Primary Key (Act_id, Emp_id),
    Foreign Key (Act_id) REFERENCES ACTIVITY,
    Foreign Key (Emp_id) REFERENCES EMPLOYEE,
    CONSTRAINT CK_ALLOCATION_RATE CHECK(Hourly_rate > 0 and Hourly_rate<300) 
);

CREATE TABLE ACTION(
    Week_no number(2) NOT NULL,
    Hrs_worked number(4,1) NOT NULL,
    Act_id number(4) NOT NULL,
    emp_id number(4) NOT NULL,
    Primary Key (Week_no, Act_id, emp_id),
    Foreign Key (Act_id) References Allocation,
    Foreign Key (emp_id) References Allocation
);

Таблицы employee, activity и allocation созданы идеально. но когда я пытаюсь создать таблицу action и ссылаюсь на внешний ключ на таблицу allocation, он говорит: ORA-02256: количество ссылочных столбцов должно соответствовать ссылочным столбцам.


person Luke    schedule 17.04.2015    source источник
comment
В сообщении об ошибке все сказано. У вас должно быть такое же количество столбцов, как и в первичном ключе, то есть 2.   -  person jarlh    schedule 17.04.2015
comment
Что мне делать тогда? Изменить таблицу распределения?   -  person Luke    schedule 17.04.2015
comment
Вы должны понять, что такое внешний ключ. Должен ли Action ссылаться на комбинацию Act_id/Emp_id или нет в распределении - и все же иметь смысл! (Кроме того, я бы назвал таблицы действиями, распределениями и т. д., поскольку они хранят несколько разных строк.)   -  person jarlh    schedule 17.04.2015


Ответы (1)


При использовании references я считаю хорошей идеей включать столбцы в обе таблицы, даже если синтаксис делает это ненужным (по умолчанию используется первичный ключ).

У вас есть составной первичный ключ, поэтому вам нужен составной ключ для внешней ссылки:

CREATE TABLE ACTION (
    Week_no number(2) NOT NULL,
    Hrs_worked number(4,1) NOT NULL,
    Act_id number(4) NOT NULL,
    emp_id number(4) NOT NULL,
    Primary Key (Week_no, Act_id, emp_id),
    Foreign Key (Act_id, emp_id) References Allocation(Act_id, emp_id)
);
person Gordon Linoff    schedule 17.04.2015
comment
Я уже пробовал это. Но он возвращает меня с другой ошибкой - person Luke; 17.04.2015
comment
@ Люк - какая ошибка? Это прекрасно работает с другими вашими определениями таблиц. Разве вы не совсем то, что показал Гордон, или вы все еще пытаетесь определить два внешних ключа? - person Alex Poole; 17.04.2015