Сообщение об ошибке довольно ясно (или, по крайней мере, лучше, чем некоторые); у вас есть внешний ключ, который пытается ссылаться на столбцы, которые не образуют уникальный или первичный ключ в родительской таблице.
В Viagem
у вас есть:
CONSTRAINT fk_Viagem_cod_veiculo FOREIGN KEY (cod_veiculo) REFERENCES Veiculo(cod_veiculo),
но первичный ключ в Veiculo
представляет собой комбинацию из двух столбцов:
CONSTRAINT pk_Veiculo_cod_veiculo_tipo_veiculo PRIMARY KEY(cod_veiculo, tipo_veiculo),
Вы не можете ссылаться на один столбец из этого ключа, так как этот отдельный столбец сам по себе не будет уникальным, что приведет к неоднозначности. Таким образом, очевидное (но, вероятно, неправильное) исправление заключается в изменении Viagem
для ссылки на оба столбца:
CONSTRAINT fk_Viagem_cod_veiculo FOREIGN KEY (cod_veiculo, tipo_veiculo)
REFERENCES Veiculo(cod_veiculo, tipo_veiculo),
(Если бы вы это сделали, тогда действительно не требовалось бы также ограничение fk_Viagem_tipo_veiculo
, поскольку tipo_veiculo
является частью FK до Veiculo
, и эта таблица уже имеет свой собственный FK до TipoVeiculo
. )
Но у вашей таблицы Encomenda
такая же проблема; у вас есть:
CONSTRAINT fk_Encomenda_cod_veiculo FOREIGN KEY (cod_veiculo) REFERENCES Veiculo(cod_veiculo),
там тоже. Но для этой таблицы у вас нет столбца id_tipo
, поэтому вы не можете включить это в FK.
Что указывает на более вероятное решение с помощью вопроса - почему Veiculo
вообще включает tipo_veiculo
в свой PK? Похоже, что cod_veiculo
должен быть уникальным сам по себе; в этом случае измените этот PK на просто:
CONSTRAINT pk_Veiculo_cod_veiculo_tipo_veiculo PRIMARY KEY(cod_veiculo),
и оставьте оба Viagem
и Encomenda
такими, как они у вас уже есть, причем все их Fk ссылаются на один столбец каждый. (Хотя вы можете решить, нужен ли вообще Viagem
столбец id_tipo
, поскольку вы можете получить его из Veiculo
через связанный cod_veiculo
...)
Если вы действительно хотите сохранить этот PK как есть, то вам нужно будет добавить отдельный уникальный ключ только для cod_veiculo
, который бы тогда удовлетворял fk_Encomenda_cod_veiculo
- но это выглядит неправильно.