Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прот-е: <fk> notnull и результат внешнего соединен 
:(
    Опции темы
Alexandering
Дата 6.5.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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' 

-------------------------------
Вот часть физ. модели: user posted image
------------------------------------------------------
Тут использую: where c.crime is null
Это верно? Ведь при создании таблиц, я указывал, что Вн.ключи notnull, однако в результате вн. соединения они все равно становятся null.
----------------------------------------------
Может я чего не понимаю.
PM MAIL   Вверх
Zloxa
Дата 6.5.2009, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Цитата(Alexandering @  6.5.2009,  16:18 Найти цитируемый пост)
Вн.ключи notnull

Внешние ключи не могут быть not null. Вы что то путаете.
Цитата(Alexandering @  6.5.2009,  16:18 Найти цитируемый пост)
Тут использую: where c.crime is null
Это верно? 

В общем и целом да.
Т.к. crime является частью первичного ключа, он не может быть null сам по себе.

Однако в результате левого соединения, если в таблице Conviction не найдется person_id, соответствующей person_id таблицы Person, вместо всех значений таблицы Conviction будут возвращены nulls, в том числе и для первичного ключа этой таблицы.



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Alexandering
Дата 6.5.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 14.9.2008

Репутация: нет
Всего: нет



Zloxa
Пасиб за оперативность.
Цитата(Zloxa @  6.5.2009,  16:49 Найти цитируемый пост)
Внешние ключи не могут быть not null. Вы что то путаете.

Ммм...у меня в лекциях другая инфа: Спецификация FK:
1) Может ли данный FK принимать неопределенное значение (null)
2) Что должно произойти при попытке удаления целевой сущности, на которую ссылается FK
3) Что должно случиться при попытке изменения <pk> целевой сущности, на которую ссылается <fk>
---------------------------------
Че-т я совсем запутался.
МСформулируйте пож-та в 2-х предложениях, когда <pk>/<fk> может быть null, а когда строго не может. Книг полно...но все равно не понятно.
PM MAIL   Вверх
Zloxa
Дата 6.5.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Цитата(Alexandering @  6.5.2009,  17:08 Найти цитируемый пост)
1) Может ли данный FK принимать неопределенное значение (null)

частица "ли" обычно используется в вопросительных выражениях а не определениях(спецификациях).

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. 
Цитата(Alexandering @  6.5.2009,  17:08 Найти цитируемый пост)
Книг полно.

Книг полно, а Вы меня просите в двух словах изложить.... Думаете вам в двух словах понятнее будет?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0946 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.