![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
foreign key и null в Interbase
chyp © (2005-10-23 11:32:00)Уважаемые коллеги, подскажите как разрешить 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) приводит к "ругани" сервера о недопустимости нулевых значений.
То есть при заполнении зависимой таблицы хотелось бы помимо определенных в основной таблице значений иметь и неопределенные. Такое возможно?
Спасибо!
Zacho (2005-10-26 18:02:00) [1]Val (from Kiev) (26.10.05 17:40) [35]
Ну с этой точки зрения действительно не маразм. Но null - это не только "нет значения", но и "значение есть, но не известно". Вот тогда - маразм. Поскольку получается, что в "родительской" таблице есть возможнонесколько записей, на которые ссылается запись в "дочерней".
А если, как было раньше, FK может ссылаться только на первичный или потенциальный ключ - таких неоднозначностей не возникало. Либо есть ссылка, либо нет. А если FK ссылается на nullable UNIQUE - то получается, что возможноссылка есть, а возможнонет. А это, имхо, потенциальный источник багов.
msguns © (26.10.05 17:42) [36]
Зачем ? Шоб було ?
А просто удобно так. Может уберечь от потенциальных багов и неоднозначностей, особенно неопытных разработчиков.
Кстати, насколько помню, такой "монстр" как Крис Дейт, был вообще против использования NULL.
ANB (2005-10-26 18:01:00) [2]И так. Имеем список чего нибудь, ну пусть сотрудником с необязательной ссылкой на какой нибудь справочник, ну пусть в/звание для военнообязанных. Если пустую ссылку я заменю 0, то могу писать запросы с обычными джойнами и все будет нормально. Если же засуну null, то мне придется использовать лефт джойны, а например оракл слегка ограничивает их использование (цепочки не допускает). Вывернуться можно, но зачем ?
msguns (2005-10-26 17:42:00) [3]>Андрей Жук © (26.10.05 13:48) [28]
>Нужно в справочник добавить запись 'none' с идентификатором 0.
Зачем ? Шоб було ?
Val (from Kiev) (2005-10-26 17:40:00) [4]почему маразм? нет значения ключевого поля в дочерней таблице - нет ссылки. ведь результат операции с null не маразм, не так ли?
Zacho (2005-10-26 17:26:00) [5]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 явное противоречие с концепцией ссылочной целостности.
Desdechado (2005-10-26 15:49:00) [6]2 ANB
> Null вполне допустим
Я разве говорил обратное? Допустим, но я считаю это вредным.
2 Sergey13 © (26.10.05 14:51) [32]
> Всегда найдутся люди, которые сумеют отобразить "неотображаемое"
А также удалить неудаляемое, изменить неизменяемое и подключиться, куда нельзя. От админа не защитишься, дураки есть везде, а хакеры - это их помесь :)
Припомни ветку ANB в "потрепаться" про защиту от админа.
Sergey13 (2005-10-26 14:51:00) [7]2[31] Андрей Жук © (26.10.05 14:46)
Это опять отдельная обработка по "неотображению". Чем тогда это лучше NULL? Всегда найдутся люди, которые сумеют отобразить "неотображаемое".
Андрей Жук (2005-10-26 14:46:00) [8]Sergey13 © (26.10.05 14:28) [30]
Кто-кто. Ты сам. Не отображай эту запись, и всего делов.
Sergey13 (2005-10-26 14:28:00) [9]2[29] ANB © (26.10.05 14:15)
> Null вполне допустим, но неудобен потом при использовании.
Отчасти - да. Но, ИМХО, есть определенная прелесть в этом "неудобстве". 8-)
Вводя в справочник нечто вроде ID=0 Value='None' ты "обрекаешь" себя на отдельнуюзаботу об этой записи. Она дожна быть, и должна быть именно такой по форме и содержанию, т.е. смысл ее должен оставаться неизменным. А что, например, запретит юзеру поменять 'None' на "Иванов". Все нормально. А вся программа летит вверх тормашками.
А нет ссылки - это всегда нет ссылки.
ANB (2005-10-26 14:15:00) [10]
> Desdechado © (26.10.05 12:24) [27]
Ключевые, но не FK поля, ссылающиеся на них. Null вполне допустим, но неудобен потом при использовании.
Андрей Жук (2005-10-26 13:48:00) [11]msguns © (24.10.05 17:29) [17]
Нужно в справочник добавить запись 'none' с идентификатором 0.
Desdechado (2005-10-26 12:24:00) [12]Zacho © (26.10.05 12:03) [26]
в моем посте [5] указан именно FB1.5.2
>Не знаю, можно ли там создать FK, ссылающийся на такой констрейнт
Только что создал.
Но согласен - глупости какие-то.
Еще раз повторю: имхо, ключевые поля должны быть NOT NULL. Я всего 1 раз в жизни использовал NULL-FK, и то по причине внешней...
Zacho (2005-10-26 12:03:00) [13]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 11:48:00) [14]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 10:22:00) [15]Johnmen © (26.10.05 10:11) [23]
Возможно. Сам я так никогда не делал, но смутно помню, что лет 7 назад в фидо обсуждались какие-то глюки, связанные с FK на UNIQUE
Johnmen (2005-10-26 10:11:00) [16]>Zacho © (26.10.05 09:52) [22]
Я так, помнится, делал (на юник). Ещё на IB4.xx. Глюков не было. И, как говорят, до сих пор нет...:)
Zacho (2005-10-26 09:52:00) [17]msguns © (26.10.05 9:17) [21]
единственным первичным ключом.
Не обязательно, FK может ссылаться и на UNIQUE. Правда, насколько помню в этом случае толи баги какие-то в IB были, толи ещё что-то неприятное :), в общем - теоритически возможно, но не рекомендуется.
msguns (2005-10-26 09:17:00) [18]>Desdechado © (24.10.05 18:05) [19]
>Вот только передергивать не надо. В [14]-[16] речь шла о том, что это поле должно быть ключом, а не о том, что оно непременно должно быть заполнено значением из справочника.
В ссылочном справочнике это поле (ID записи спр-ка) должно быть не просто ключом, а единственным первичным ключом.
Если ты это хотел сказать, то надо было писать разборчиво, редиска ;)
chyp (2005-10-25 23:59:00) [19]
> msguns © (24.10.05 17:29) [17]
именно про этот случай и идет речь.
Desdechado (2005-10-24 18:05:00) [20]2 msguns © (24.10.05 17:29) [17]
Вот только передергивать не надо. В [14]-[16] речь шла о том, что это поле должно быть ключом, а не о том, что оно непременно должно быть заполнено значением из справочника.
А свое отношение с заполнению этого поля я уже отдельно сказал.