![]() |
Модераторы: LSD |
![]() ![]() ![]() |
|
Alexandering |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 14.9.2008 Репутация: нет Всего: нет |
Делая курсач по БД столкнулся с проблемой:
для общности сделал, чтоб все внешние ключи были notnull, Хотя тут я немного не понимаю. Допустим есть сущность "Персонал" и "Судимость". В "Судимости" внешний ключ на person_id. Поскольку у человека может не быть судимостей, то ???? Исходя из этого я могу заключить, что внешний ключ может быть null, или на какой вопрос нужно ответить, чтоб понять, может ли быть вн. ключ notnull? --------------------- В связи с этим: спроектировал БД, как уже написал, все вн. ключи - notnull. Теперь, требуется в запросе, скажем, выбрать всех людей, у кого нет судимости. Я так понимаю, надо юзать внешнее соединение: Select p.person_id, p.first_name || ' ' || p.second_name from Person_type p_t left outer join Person p on (p.classification = p_t.classification) // left outer join Conviction c on (p.person_id = c.person_id) where c.crime is null and p_t.classification_description = 'Analyst' ------------------------------- Вот часть физ. модели: ![]() ------------------------------------------------------ Тут использую: where c.crime is null Это верно? Ведь при создании таблиц, я указывал, что Вн.ключи notnull, однако в результате вн. соединения они все равно становятся null. ---------------------------------------------- Может я чего не понимаю. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 11 Всего: 161 |
Внешние ключи не могут быть not null. Вы что то путаете. В общем и целом да. Т.к. crime является частью первичного ключа, он не может быть null сам по себе. Однако в результате левого соединения, если в таблице Conviction не найдется person_id, соответствующей person_id таблицы Person, вместо всех значений таблицы Conviction будут возвращены nulls, в том числе и для первичного ключа этой таблицы. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Alexandering |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 14.9.2008 Репутация: нет Всего: нет |
Zloxa,
Пасиб за оперативность. Ммм...у меня в лекциях другая инфа: Спецификация FK: 1) Может ли данный FK принимать неопределенное значение (null) 2) Что должно произойти при попытке удаления целевой сущности, на которую ссылается FK 3) Что должно случиться при попытке изменения <pk> целевой сущности, на которую ссылается <fk> --------------------------------- Че-т я совсем запутался. МСформулируйте пож-та в 2-х предложениях, когда <pk>/<fk> может быть null, а когда строго не может. Книг полно...но все равно не понятно. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 11 Всего: 161 |
частица "ли" обычно используется в вопросительных выражениях а не определениях(спецификациях). FK не может принимать никаких значений в принципе. FK это ограничение целостности, он не хранит данные, это ПРАВИЛО их хранения. когда мы для поля person_id таблицы Conviction определяем foreign key references Person(person_id), это означает что в этом поле может быть либо null либо значение, определенное в Person.person_id На поле Conviction.person_id мы можем дополнительно наложить ограничение not null. Хочу обратить внимание, что это именно отдельное ограничение, никак не связанное с FK. В вашем случае, это ограничение наложено первичным ключом. Первичный ключ эквивалентен комбинации ограничения уникальности и not null. Тем не менее наличие этих ограничений не означает что в таблице Conviction должны быть сохранены ВСЕ Person.person_id. Таблица Conviction может вообще не содержать записей. В этом случае запрос: "select * from Person left join Conviction on Conviction.person_id = Person.person_id" вернет все значения Person, однако для тех значений, Person, для которых не обнаружен Conviction (т.е для всех) будет возвращен Null. Книг полно, а Вы меня просите в двух словах изложить.... Думаете вам в двух словах понятнее будет? -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Общие вопросы по базам данных" | |
|
Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:
Данный форум не предназначен для:
Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение.
Полезные советы: Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | СУБД, общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |