Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.11;
Скачать: CL | DM;

Вниз

foreign key и null в Interbase   Найти похожие ветки 

 
chyp ©   (2005-10-23 11:32) [0]

Уважаемые коллеги, подскажите как разрешить null-значения в поле таблицы Interbase, объявленное как foreign key?

То есть имеем две таблицы:
CREATE TABLE TB_CATEGORY
(
 ID_CATEGORY    INTEGER NOT NULL,
 NAME               VARCHAR(20),
CONSTRAINT PCATEGORY_ID PRIMARY KEY (ID_CATEGORY)
);
CREATE TABLE TB_ITEM
(
 ID_ITEM        INTEGER NOT NULL,
 NAME            VARCHAR(20),
 ID_CATEGORY INTEGER ,
CONSTRAINT PTEM_ID PRIMARY KEY (ID_ITEM),
FOREIGN KEY (ID_CATEGORY)
          REFERENCES TB_CATEGORY(ID_CATEGORY) ON UPDATE CASCADE ON DELETE CASCADE
);

Теперь попытка внесения во вторую (зависимую) таблицу записи с пустым значением (NULL) в поле с аттрибутом FOREIGN KEY (ID_CATEGORY) приводит к "ругани" сервера о недопустимости нулевых значений.

То есть при заполнении зависимой таблицы хотелось бы помимо определенных в основной таблице значений иметь и неопределенные. Такое возможно?

Спасибо!


 
atruhin ©   (2005-10-23 11:35) [1]

>>Такое возможно?
Нет.
Как вариант, убери FK и делай необходимую проверку в тригере.


 
msguns ©   (2005-10-23 12:05) [2]

Возможно.


 
Sergey Masloff   (2005-10-23 12:06) [3]

Тоже мне бином ньютона. Заведи в основной таблице "определенное" значение со смыслом NULL VALUE и ссылайся на него


 
chyp ©   (2005-10-23 12:53) [4]


> Возможно.
? если:
> Заведи в основной таблице "определенное" значение со смыслом
> NULL VALUE и ссылайся на него


Согласен, но, допустим, задача усложняется:
есть таблица "Юзеры", для нее связанная - "Адреса". И теперь для таблицы "Переписка": сначала выбирается Юзер, затем его адрес - что же теперь, для каждого юзера вводить дополнительную "пустую" запись адреса?


 
Desdechado ©   (2005-10-23 18:45) [5]

2 chyp
Только что проверил на FB1.5.2 - твоя конструкция вполне работоспособна, никакой ругани не наблюдается. Сам я предпочитаю такими вещамине пользоваться, просто в справочнике завожу всегда "не определено" одной из строк (например, с кодом 0). Тогда все NOT NULL и индексы, кстати, лучше работают.
Может, эо у тебя компоненты какие-то ругаются, которые не знают о возможности NULL во внешнем ключе?

> для каждого юзера вводить дополнительную "пустую" запись адреса?
Зачем? Одну на всех.


 
msguns ©   (2005-10-23 20:01) [6]

Убери каскадное удаление и будет она "пропускать" пустые значения для форинеров


 
Fay ©   (2005-10-24 02:05) [7]

2 chyp ©   (23.10.05 11:32)
Переходи на FB


 
Johnmen ©   (2005-10-24 09:43) [8]


> Fay ©   (24.10.05 02:05) [7]
> 2 chyp ©   (23.10.05 11:32)
> Переходи на FB


И что?


 
chyp ©   (2005-10-24 13:21) [9]

Спасибо всем за советы.
После долгих проб обнаружил интересную фичу: стоило поле внешнего ключа назвать другим именем, т.е:

FOREIGN KEY (ID_CAT)
         REFERENCES TB_CATEGORY(ID_CATEGORY) ON UPDATE CASCADE ON DELETE CASCADE

как все заработало!?


 
Val ©   (2005-10-24 13:31) [10]

я бы предположил баг, если честно.


 
Desdechado ©   (2005-10-24 13:33) [11]

рекомендую все-таки не допускать NULL в ключевых полях, ибо:
1. в индексы NULL-значения не включаются, поэтому проверки fld is null приводят к PLAN NATURAL, что плохо
2. все NULL для сервера - разные, поэтому наложить UNIQUE можно, вот только строк с NULL Будет сколько угодно, да и сравнения с NULL по-другому писать приходится, что вовсе неудобно


 
msguns ©   (2005-10-24 16:04) [12]

>Desdechado ©   (24.10.05 13:33) [11]
>рекомендую все-таки не допускать NULL в ключевых полях

Ты не понял: ссылка на справочник не есть ключевое поле, а очень даже обнаковенное. И в нем вполне может быть NULL. Хоть в ИБ, хоть где угодно. А вот в спр-ке лона, знамо дело, ключевое (ID)


 
ANB ©   (2005-10-24 16:09) [13]


> msguns ©   (24.10.05 16:04) [12]

Я бы согласился с Desdechado. 0 как пустое значение - очень удобно. И не нужны лефт джойны. И сравнения легче писать. Сам уже наступал на грабли. Были споры - как лучше - null или 0, практика показала, что 0 удобнее для программиста.


 
Desdechado ©   (2005-10-24 16:45) [14]

2 msguns ©   (24.10.05 16:04) [12]
> ссылка на справочник не есть ключевое поле, а очень даже обнаковенное
это foreign KEY - перевести?


 
msguns ©   (2005-10-24 16:50) [15]

>Desdechado ©   (24.10.05 16:45) [14]
>это foreign KEY - перевести?

Да я вроде и сам знаю несколько иностранных слов..
Ты вот мне объясни, каким боком в ссылающейся таблице поле, ссылающееся, например на справочник, должно быть непременно ключом ?


 
Desdechado ©   (2005-10-24 17:11) [16]

2 msguns ©   (24.10.05 16:50) [15]
Вообще-то, про долженствование я не говорил, хотя и считаю, что ДОЛЖНО. Для сохранения логической целостности БД и данных в ней.
Это ж вообще самые азы. Я считал, что вы это знаете. Видимо, переоценивал...


 
msguns ©   (2005-10-24 17:29) [17]

>Desdechado ©   (24.10.05 17:11) [16]
>Вообще-то, про долженствование я не говорил, хотя и считаю, что ДОЛЖНО. Для сохранения логической целостности БД и данных в ней.

Какая целостность ? Есть таблица лицевых карточек работников, где среди прочих графа (поле) "Воинское звание", ссылающееся на соотв.справочник.
Так что, "азы" утверждают, что в этом поле должно стоять какое-то значение у всех работников предприятия, в т.ч. женщин ? Или они твердят, что в справочник воинских званий надо к сержантам, прапорам и адмиралам добавить "невоеннообязанный" ?

Если "ДА", то будь так добр, дай невежде источник, где это написано.


 
Johnmen ©   (2005-10-24 17:37) [18]

>msguns ©   (24.10.05 17:29) [17]

Совершенно верно. Вполне м.б.ситуация, когда ссылочное поле д.б. пустым.


 
Desdechado ©   (2005-10-24 18:05) [19]

2 msguns ©   (24.10.05 17:29) [17]
Вот только передергивать не надо. В [14]-[16] речь шла о том, что это поле должно быть ключом, а не о том, что оно непременно должно быть заполнено значением из справочника.
А свое отношение с заполнению этого поля я уже отдельно сказал.


 
chyp ©   (2005-10-25 23:59) [20]


> msguns ©   (24.10.05 17:29) [17]

именно про этот случай и идет речь.


 
msguns ©   (2005-10-26 09:17) [21]

>Desdechado ©   (24.10.05 18:05) [19]
>Вот только передергивать не надо. В [14]-[16] речь шла о том, что это поле должно быть ключом, а не о том, что оно непременно должно быть заполнено значением из справочника.

В ссылочном справочнике это поле (ID записи спр-ка) должно быть не просто ключом, а единственным первичным ключом.
Если ты это хотел сказать, то надо было писать разборчиво, редиска ;)


 
Zacho ©   (2005-10-26 09:52) [22]

msguns ©   (26.10.05 9:17) [21]
единственным первичным ключом.


Не обязательно, FK может ссылаться и на UNIQUE. Правда, насколько помню в этом случае толи баги какие-то в IB были, толи ещё что-то неприятное :), в общем - теоритически возможно, но не рекомендуется.


 
Johnmen ©   (2005-10-26 10:11) [23]

>Zacho ©   (26.10.05 09:52) [22]

Я так, помнится, делал (на юник). Ещё на IB4.xx. Глюков не было. И, как говорят, до сих пор нет...:)


 
Zacho ©   (2005-10-26 10:22) [24]

Johnmen ©   (26.10.05 10:11) [23]

Возможно. Сам я так никогда не делал, но смутно помню, что лет 7 назад в фидо обсуждались какие-то глюки, связанные с FK на UNIQUE


 
Desdechado ©   (2005-10-26 11:48) [25]

msguns ©   (26.10.05 09:17) [21]
Не проснулся еще что ли? :) Мои посты вместе надо читать и в общем контексте, а не по отдельности.
Я говорил о внешнем ключе, о FOREIGN KEY, о поле с ним. Оно не обязано быть заполненным, но признак FK должно иметь (если логически ссылается на справочник), иначе логическая целостность БД нарушится.

Zacho ©   (26.10.05 10:22) [24]
> глюки, связанные с FK на UNIQUE
Тоже не пользуюсь этим, но подозреваю, что причина в том, что, как я уже говорил, все NULL - разные, и можно вставить много NULL в UNIQUE-поле, и NULL-FK будут иметь проблемы с определением, на какой NULL-UNIQUE им ссылаться.


 
Zacho ©   (2005-10-26 12:03) [26]

Desdechado ©   (26.10.05 11:48) [25]
можно вставить много NULL в UNIQUE-поле


Нельзя. UNIQUE можно создать только для NOT NULL полей.

В Data Definition Guide же всё подробно описано, и про UNIQUE и про FK.

Правда, в FB1.5 в UNIQUE CONSTRAINT допустимы NULL"ы. Не знаю, можно ли там создать FK, ссылающийся на такой констрейнт, но по логике должно быть нельзя, поскольку бессмысленно.


 
Desdechado ©   (2005-10-26 12:24) [27]

Zacho ©   (26.10.05 12:03) [26]
в моем посте [5] указан именно FB1.5.2
>Не знаю, можно ли там создать FK, ссылающийся на такой констрейнт
Только что создал.
Но согласен - глупости какие-то.

Еще раз повторю: имхо, ключевые поля должны быть NOT NULL. Я всего 1 раз в жизни использовал NULL-FK, и то по причине внешней...


 
Андрей Жук ©   (2005-10-26 13:48) [28]

msguns ©   (24.10.05 17:29) [17]
Нужно в справочник добавить запись "none" с идентификатором 0.


 
ANB ©   (2005-10-26 14:15) [29]


> Desdechado ©   (26.10.05 12:24) [27]

Ключевые, но не FK поля, ссылающиеся на них. Null вполне допустим, но неудобен потом при использовании.


 
Sergey13 ©   (2005-10-26 14:28) [30]

2[29] ANB ©   (26.10.05 14:15)
> Null вполне допустим, но неудобен потом при использовании.

Отчасти - да. Но, ИМХО, есть определенная прелесть в этом "неудобстве". 8-)

Вводя в справочник нечто вроде ID=0 Value="None" ты "обрекаешь" себя на отдельную заботу об этой записи. Она дожна быть, и должна быть именно такой по форме и содержанию, т.е. смысл ее должен оставаться неизменным. А что, например, запретит юзеру поменять "None" на "Иванов". Все нормально. А вся программа летит вверх тормашками.
А нет ссылки - это всегда нет ссылки.


 
Андрей Жук ©   (2005-10-26 14:46) [31]

Sergey13 ©   (26.10.05 14:28) [30]
Кто-кто. Ты сам. Не отображай эту запись, и всего делов.


 
Sergey13 ©   (2005-10-26 14:51) [32]

2[31] Андрей Жук ©   (26.10.05 14:46)
Это опять отдельная обработка по "неотображению". Чем тогда это лучше NULL? Всегда найдутся люди, которые сумеют отобразить "неотображаемое".


 
Desdechado ©   (2005-10-26 15:49) [33]

2 ANB
> Null вполне допустим
Я разве говорил обратное? Допустим, но я считаю это вредным.

2 Sergey13 ©   (26.10.05 14:51) [32]
> Всегда найдутся люди, которые сумеют отобразить "неотображаемое"
А также удалить неудаляемое, изменить неизменяемое и подключиться, куда нельзя. От админа не защитишься, дураки есть везде, а хакеры - это их помесь :)
Припомни ветку ANB в "потрепаться" про защиту от админа.


 
Zacho ©   (2005-10-26 17:26) [34]

Desdechado ©   (26.10.05 12:24) [27]
в моем посте [5] указан именно FB1.5.2


Но я-то в [24] писал о событях 7-ми летней давности, когда FB ещё и в проекте не было :) А в IB тогда (а может и сейчас, не знаю) UNIQUE мог быть только NOT NULL

А насчёт FB 1.5 - мне никогда не нужны были NULL в UNIQUE, но сейчас ради эксперимента попробовал. Создал две таблицы, T1 и T2. В первой - nullable поле T1_ID с UNIQUE CONSTRAINT, во второй - поле T1_ID_REFERENCE с FK, ссылающимся на поле T1_ID в таблице T1. Добавляю в таблицу T1 несколько записей с T1_ID=NULL. Всё Ok. Добавляю во вторую несколько записей с T1_ID_REFERENCE=NULL. Всё Ok.
Маразм !!! Ну и как понять, на какую именно запись из T1 ссылается запись из T2 ???
Либо я чего-то не понимаю, либо в FB 1.5 явное противоречие с концепцией ссылочной целостности.


 
Val (from Kiev)   (2005-10-26 17:40) [35]

почему маразм? нет значения ключевого поля в дочерней таблице - нет ссылки. ведь результат операции с null не маразм, не так ли?


 
msguns ©   (2005-10-26 17:42) [36]

>Андрей Жук ©   (26.10.05 13:48) [28]
>Нужно в справочник добавить запись "none" с идентификатором 0.

Зачем ? Шоб було ?


 
ANB ©   (2005-10-26 18:01) [37]

И так. Имеем список чего нибудь, ну пусть сотрудником с необязательной ссылкой на какой нибудь справочник, ну пусть в/звание для военнообязанных. Если пустую ссылку я заменю 0, то могу писать запросы с обычными джойнами и все будет нормально. Если же засуну null, то мне придется использовать лефт джойны, а например оракл слегка ограничивает их использование (цепочки не допускает). Вывернуться можно, но зачем ?


 
Zacho ©   (2005-10-26 18:02) [38]

Val (from Kiev)   (26.10.05 17:40) [35]

Ну с этой точки зрения действительно не маразм. Но null - это не только "нет значения", но и "значение есть, но не известно". Вот тогда - маразм. Поскольку получается, что в "родительской" таблице есть возможно несколько записей, на которые ссылается запись в "дочерней".
А если, как было раньше, FK может ссылаться только на первичный или потенциальный ключ - таких неоднозначностей не возникало. Либо есть ссылка, либо нет. А если FK ссылается на nullable UNIQUE - то получается, что возможно ссылка есть, а возможно нет. А это, имхо, потенциальный источник багов.

msguns ©   (26.10.05 17:42) [36]
Зачем ? Шоб було ?


А просто удобно так. Может уберечь от потенциальных багов и неоднозначностей, особенно неопытных разработчиков.

Кстати, насколько помню, такой "монстр" как Крис Дейт, был вообще против использования NULL.



Страницы: 1 вся ветка

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.042 c
4-1128934874
Vano85
2005-10-10 13:01
2005.12.11
Мониторинг за файлами


2-1132666961
DelphiLexx
2005-11-22 16:42
2005.12.11
Что такое TrueType шрифты


14-1132192872
SPeller
2005-11-17 05:01
2005.12.11
Вторая мировая и роль США в ней


14-1132307208
Andersen
2005-11-18 12:46
2005.12.11
Сериал Есенин


2-1132933237
DelphiLexx
2005-11-25 18:40
2005.12.11
Наследование форм - выдается ошибка