Внешний ключ гарантирует, что вы не будете делать ссылку на несуществующую запись. Ограничения, создаваемые внешними ключами, часто считаются основополагающими для обеспечения целостности данных в базе данных.
На самом деле, я думаю, ваш первый внешний ключ может быть изменен следующим образом:
ALTER TABLE `settings` ADD FOREIGN KEY (user_id) REFERENCES `users` (`user_id`);
Это гарантирует, что любой user_id
в таблице settings
будет действительным user_id
, уже присутствующим в таблице users
. Кроме того, он не позволит вам удалить строку в таблице users
, если в таблице settings
все еще есть строка, которая ссылается на пользователя, который будет удален. Таким образом, он также будет следить за тем, чтобы не было строк-сирот.
Ваш исходный внешний ключ потребовал бы вставки строки настроек перед строкой пользователей, что, как я полагаю, не является вашим намерением. Этот внешний ключ проверяет наличие user_id
в таблице settings
, прежде чем разрешить нового пользователя в таблице users
.
Что касается следующего внешнего ключа:
ALTER TABLE `logins` ADD FOREIGN KEY (user_id) REFERENCES `users` (`user_id`);
Это также гарантирует, что любой user_id
в таблице logins
будет действительным user_id
, уже присутствующим в таблице users
. База данных не позволит вам иметь запись с user_id = 100
в таблице logins
, если в таблице нет пользователя с user_id = 100
users
.
Вы можете применить ту же логику к ограничению mail_threads
, для которого требуется folder_id
, уже присутствующее в таблице mail_folders
, и то же самое для ограничения mail_message
, для которого требуется действительное thread_id
.