Отношения между таблицами («внешними ключами») определены между столбцами, а не значениями. Пример:
create table machine ( id identity );
create table owner ( id identity );
create table isDone ( machineId, ownerId );
Теперь вы можете сказать "isDone.machineId
должно существовать в таблице machine
":
ALTER TABLE isDone
ADD CONSTRAINT machineFK
FOREIGN KEY (machineId)
REFERENCES machine (id)
;
В результате база данных выдаст ошибку, если вы попытаетесь вставить строку в isDone
со значением для столбца machineId
, которого нет нигде в таблице machine
(где select Count(*) from machine where id = machineId
возвращает 0).
Таким образом, вы должны разделить время определения (где вы говорите, что является действительным, а что нет) и время, когда вы манипулируете данными в базе данных.
Когда вы используете эту функцию в своей базе данных, вы должны убедиться, что машина и владелец существуют в момент создания новой строки в isDone
. Обычно это просто: каждый день появляются новые смены, но нет новых машин и отделов. Таким образом, вы можете создавать новые машины и отделы, когда они куплены / основаны. Первая смена с использованием одного из них, вероятно, произойдет очень долго после этого.
Что касается других ключей: столбец автоинкремента должен быть первичным ключом (PK) вашей таблицы и ничем иным. Позже вы можете создать индексы для другого столбца, если обнаружите, что некоторые запросы работают плохо. Но для начала должно быть достаточно колонки auto-inc PK. Это упрощает формирование ограничений внешнего ключа.
Пример. Если вы используете имя отдела в качестве первичного ключа, у вас могут возникнуть проблемы при изменении названия отдела.
Кроме того, я предлагаю вам использовать реальное имя объектов (например, «отдел» или «владелец» вместо «пользователь») в вашем дизайне. Это упростит просмотр того, что и что искать, когда вы что-то ищете.