LINUX.ORG.RU

[mysql] Зачем нужны внешние ключи?

 


0

0

Суть такова... К примеру, имеются две таблички:

Table1:
TitleID(PRIMARY KEY AUTO INCREMENT...), Title (TEXT...)

Table2:
PostID(PRIMARY KEY AUTOINCREMENT...), Post(TEXT) , FkID( FOREIGN KEY(FkID) REFERENCES Table1(TitleID)...)

Тем самым мы имеем внешний ключ FkID в Table2 к первичному ключу TitleID в Table1. Но тут возникает проблема c внешними ключами при insert'ах в таблицы:

INSERT INTO Table1 VALUES (null, 'топик бла-бла-бла'); - к примеру создаем 10 тему на форуме
INSERT INTO Table2 VALUES (null, 'троллинг...троллинг...троллинг', 10) - здесь указываем в последнем параметре "ссылку" на "тему(10)".

Вопросы:
Получается так, что понятие - "внешний ключ", имеет чисто условный характер, так как во 2-ом insert'е мы В РУЧНУЮ указывали "ссылку на тему" в последнем параметре?
Как можно автоматизировать добавление значения к внешнему ключу?
Ну и собстно...субж?



Они нужны для поддержания целостности базы, в твоем случае, что бы нельзя было создать пост не привязанный ни какому топику, нельзя было удалить топик, если в нем есть посты, или удалить топик, а заодно автоматически удалить из базы все посты связанные с ним.

anotheranonymous
()
Ответ на: комментарий от anotheranonymous

Ок, спасибо за разъяснения, но есть еще вопросики:
Как автоматизировать получения значения для внешнего ключа во 2-ом insert'e ?
Правильно ли будет всю эту группу операторов "оформить" в транзакцию?

tadjeek
() автор топика
Ответ на: комментарий от tadjeek

>Как автоматизировать получения значения для внешнего ключа во 2-ом insert'e ?

В mysql можно через SELECT LAST_INSERT_ID();

>Правильно ли будет всю эту группу операторов "оформить" в транзакцию?


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

anotheranonymous
()
Ответ на: комментарий от anotheranonymous

Хотя в данном случае да все таки - в одной транзакции, если именно создать топик, и создать сразу пост, для которого нужно получить значение идентификатора топика.

anotheranonymous
()
Ответ на: комментарий от anotheranonymous

А ты не пробовал поступать "как положено"?

То есть завести sequence, получить из него ID "топика", потом вставить в таблицу ЗАРАНЕЕ УКАЗАВ НУЖНЫЙ ID, и потом вставлять в таблицу "постов" уже зная ID "топика".

// Заколебали быдлокодеры!

no-dashi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.