powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Непонятки с null-able FOREIGN KEY
38 сообщений из 38, показаны все 2 страниц
Непонятки с null-able FOREIGN KEY
    #39208223
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.

Есть родительская таблица DADDY в которой определен UNIQUE по 2-м полям, одно из которых null-able.
Есть дочерняя таблица CHILD в которой по 2-м полям определен FOREIGN KEY на UNIQUE таблицы DADDY.

Вставка записи в таблицу CHILD со значениями FK, которые отсутствуют в таблице DADDY проходит без ошибок.

Это так и должно быть?

Вот скрипт:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE TABLE DADDY (
    ID    INTEGER NOT NULL PRIMARY KEY,
    UNQ1  INTEGER NOT NULL,
    UNQ2  INTEGER
);
ALTER TABLE DADDY
  ADD CONSTRAINT DADDY_UNQ
      UNIQUE (UNQ1, UNQ2);

CREATE TABLE CHILD (
    ID    INTEGER NOT NULL PRIMARY KEY,
    UNQ1  INTEGER NOT NULL,
    UNQ2  INTEGER
);
ALTER TABLE CHILD
  ADD CONSTRAINT FK_CHILD_DADDY
      FOREIGN KEY (UNQ1, UNQ2) REFERENCES DADDY (UNQ1, UNQ2);


INSERT INTO CHILD (ID, UNQ1, UNQ2) VALUES (1, 100, NULL);

COMMIT;


С уважением, Polesov.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208230
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

содержимое таблицы DADDY какое. Она совсем пуста или там что-то есть?

З.Ы. И чего только народ не придумает ...
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208231
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, таблица DADDY пустая
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208243
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 5 апреля 2016 г. 12:15:26:

Симонов Денис> И чего только народ не придумает ..
долбишь им, долбишь 18950358
нихрена не внемлют.
папуасы, мля.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208245
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня ощущение, что это и в документации есть: с null можешь их вставлять сколько хочешь.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208253
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

я сомневаюсь, что это правильно. Если было одно nullable поле понятно, а тут составной ключ, а в нём нюансы есть. Например сам unique допускает в данном случае (1, null), (2, null) и так далее. Но вот как это должно работать в FK хз. Автор сего ограничения обладает весьма извращённой фантазией. Что он хочет от такого ключа?
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208260
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисАвтор сего ограничения обладает весьма извращённой фантазией. Что он хочет от такого ключа?
Автор хочет понять, это нормальное поведение для такого FK или ошибка.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208274
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
виктор михалыч, не мелочись - пиши сразу UDF для этого случая.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208277
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

я не знаю. Возможно что и правильно
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208283
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисВозможно что и правильно

Если правильно, то будет использована другая схема FK (менее подходящая, надо сказать).
А если нет, то возможно будет исправлена еще одна ошибка.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208290
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

я ожидал такого теста от Таблоида, ибо он может их делать просто так ради изврата, но чтобы кто-то придумал такой FK всерьёз для меня очень неожиданно.

И всё же интересно откуда такая идея возникла. И как в этом случае предполагается соединять такие таблицы? Типа того

Код: sql
1.
2.
3.
4.
SELECT COUNT(*)
FROM DADDY
JOIN CHILD ON DADDY.UNQ1 = CHILD.UNQ1 
          AND DADDY.UNQ2 IS NOT DISTINCT FROM CHILD.UNQ2
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208308
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисИ всё же интересно откуда такая идея возникла.
Все немного по другому - надо обрабатывать валидность внешних данных по значениям различных типов FK.
При обработке такого типа FK из-за ошибки в алгоритме данные были записаны, что и породило тест-кейс из старт-топика.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208329
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

а я бы между последним ALTER TABLE и первым INSERT сделал бы commit, а еще лучше пере-коннект
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208336
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

я думаю у него и так по умолчанию включено AUTODDL
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208338
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochPolesov,

а я бы между последним ALTER TABLE и первым INSERT сделал бы commit, а еще лучше пере-коннект
В жизни оно так и происходило - все FK были созданы сильно заранее до INSERT-а, и реконнектов было множество.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208344
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда на мой личный вкус это баг

http://www.firebirdsql.org/manual/nullguide-keys.html#nullguide-keys-fk

Foreign key columns must always reference ... a primary key or a unique key

То есть постулируется четкое отображение записей с каждым конкретным FK на PK/U constraint (сключая записи без родителя), соответственно должны работать и правила на частичный Null в этих constrants

Но Even if NULLs are absolutely forbidden in the target key (for instance if the target is a PK), the foreign key column may still contain NULLs , unless this is prevented by additional constraints.

Вот этот кусок, видимо, реализовали в смысле "хотя бы один нулл", а не "состоит из нуллов"
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208356
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, в связи с Foreign key columns must always reference a column (or set of columns) that is a primary key or a unique key. A unique index on the referenced column(s) is not enough .

кажется было бы логично и на уровне DDL выражать именно это самое.
Цель (intention), а не реализацию. Целевой "key", а не толко произвольный список столбцов, который может быть совпадает с определением какого-нибудь констрейнта

Polesov
Код: plsql
1.
2.
3.
4.
5.
6.
7.
ALTER TABLE DADDY
  ADD CONSTRAINT DADDY_UNQ
      UNIQUE (UNQ1, UNQ2);

ALTER TABLE CHILD
  ADD CONSTRAINT FK_CHILD_DADDY
      FOREIGN KEY (UNQ1, UNQ2) REFERENCES DADDY_UNQ;
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208363
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

я тебе более простой примерчик придумал

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
recreate table master (
  id int not null primary key, 
  f1 int unique
);

recreate table detail (
  id int not null primary key, 
  f1 int references master(f1)
);

insert into detail(id, f1) values (1, null);

commit;

insert into detail(id, f1) values (2, 1);

violation of FOREIGN KEY constraint "".
violation of FOREIGN KEY constraint "INTEG_19" on table "DETAIL".
Foreign key reference target does not exist.
Problematic key value is ("F1" = 1).



подозреваю что у составного fk логика та же
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208391
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денися тебе более простой примерчик придумал

Это не "более простой" - это другой вообще.

Это пример all-null, когда запись в явном виде выводится из под действия констрейнтов.
Когда мы заявляем что мы не знаем значения данного аттрибутоа (простого или составного не важно) и не может поэтому его проверять.

А у топик стартера есть значение аттрибута, просто в нём некоторые (но не все) поля null

Это другой случай, его как раз в 2.0 правили в приложении к Unique Constraint но видимо забыли поправить для FK....
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208410
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

ладно подождём что скажут dimitr и hvlad. Надо бы ещё узнать что об этом думает стандарт.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208421
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 5 апреля 2016 г. 14:43:38:

Симонов Денис> ладно подождём что скажут dimitr и hvlad. Надо бы ещё узнать что об этом думает стандарт.
обсуждалось лет 10 тому назад.
но не на сруле, если не ошибаюсь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208433
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все по стандарту
SQL:2011The choices for <match type> are MATCH SIMPLE, MATCH PARTIAL, and MATCH FULL; MATCH
SIMPLE is the default
. There is no semantic difference between these choices if there is only one referencing
column (and, hence, only one referenced column). There is also no semantic difference if all referencing columns
are not nullable. If there is more than one referencing column, at least one of which is nullable, and if no <ref-
erencing period specification> is specified, then the various <match type>s have the following semantics:
— MATCH SIMPLE: if at least one referencing column is null, then the row of the referencing table passes
the constraint check
. If all referencing columns are not null, then the row passes the constraint check if
and only if there is a row of the referenced table that matches all the referencing columns.
— MATCH PARTIAL: if all referencing columns are null, then the row of the referencing table passes the
constraint check. If at least one referencing columns is not null, then the row passes the constraint check
if and only if there is a row of the referenced table that matches all the non-null referencing columns.
— MATCH FULL: if all referencing columns are null, then the row of the referencing table passes the constraint
check. If all referencing columns are not null, then the row passes the constraint check if and only if there
is a row of the referenced table that matches all the referencing columns. If some referencing column is
null and another referencing column is nonnull, then the row of the referencing table violates the constraint
check.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208440
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

вот как оказалось это не баг. Если есть желание можешь пожелать предложение MATCH для FK в трекере.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208485
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrвсе по стандарту
Отлично - получилось так, что ошибки в алгоритме проверки валидности данных по FK нет :-)
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208486
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисPolesov,

Если есть желание можешь пожелать предложение MATCH для FK в трекере.
Не-е-е... Желания нету.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208488
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL:2011only if there is a row of the referenced table that matches all the non-null referencing columns.

Мда, формулировочка...

Daddy: (1, 2, 3 ) -- unique key: 2,3
Child: (-1, 2, NULL ) -- Foreign Key: 2, NULL

Если по "букве закона", то такое должно быть нормально для MATCH PARTIAL

Какой в этом практический смысл - хз
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208492
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochКакой в этом практический смысл - хз
Точно такой же как и в unique с null-ами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208635
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

чтобы "точно такой же" (2, Null) не должен соответсвовать (2,3), также как это считаются корректными но разными значениями внутри unique

Но процитированное - если читать буквально - означает что значение (2,null) внешнего индекса соответствует любым значениям (2, что-нибудь) родительской таблицы. Это совсем другoе дело
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208638
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

нет как раз наоборот

означает что значение (2,null) внешнего индекса не соответствует любым значениям (2, что-нибудь) родительской таблицы.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208640
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

"стандарт плох, но таков стандарт" © ДЕ
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208683
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

с какой стати не соответсвует, если соответсвует ? "matches all the non-null referencing columns"

Нуллы во внимание просто не принимаются, игнорируются при сравнении, как если бы соотв. столбцы не входили в ключи.

...а то, что это стандарт, я не спорю.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39208829
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochс какой стати не соответсвует, если соответсвует ? "matches all the non-null referencing columns"

ты урезал оригинал. а там написано
MATCH SIMPLE: if at least one referencing column is null, then the row of the referencing table passes
the constraint check. If all referencing columns are not null, then the row passes the constraint check if
and only if there is a row of the referenced table that matches all the referencing columns.


если хотя бы один столбец ссылки содержит null, то строка проходит контроль ссылочной целостности.
Если ВСЕ столбцы FK not null, то строка проходит контроль только если есть точно соответствующая строка в таблице, на которую ссылается FK.

То есть - заполнены все столбцы - контроль есть. Хоть один стольбец null - контроля соответствия нет. null <> null, поэтому
1, null <> 1, null.

А вот с MATCH PARTIAL - так как тебе кажется:
If at least one referencing columns is not null, then the row passes the constraint check if and only if there is a row of the referenced table that matches all the non-null referencing columns.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39209167
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvAriochс какой стати не соответсвует, если соответсвует ? "matches all the non-null referencing columns"

ты урезал оригинал. а там написано
MATCH SIMPLE:

Стоп-стоп-стоп, какой нафиг SIMPLE ?

19019548 - я как раз именно писал про PARTIAL и только про PARTIAL


kdvА вот с MATCH PARTIAL - так как тебе кажется:

о чем и речь: получается, что отдельно взятая запись FK иногда мoжет соответствовать сразу нескольким записям в мастере.
...что на мой взгляд отдаёт бредом, хотя возможно мне просто мозгов не хватает представить когда это было бы реально нужно.

Фактически в этом контексте NULL станолвится как звёздочка в именах файлов - "подходит всё".
Но - зачем?

Хотя, спору нет, dura SQL sed SQL...
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39209187
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Arioch!
You wrote on 6 апреля 2016 г. 13:11:19:

Arioch> о чем и речь: получается, что отдельно взятая запись FK иногда мoжет соответствовать сразу нескольким записям в мастере.
> ...что на мой взгляд отдаёт бредом, хотя возможно мне просто мозгов не хватает представить когда это было бы реально нужно.
множественное наследование в ООП
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39209206
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochФактически в этом контексте NULL станолвится как звёздочка в именах файлов - "подходит всё".
ну, насколько я понимаю, запись в детали (2, null) будет соответствовать записям в мастере (2, null), (2, 1), (2, 2)...
если это надо исключить, и соответствовать только (2, null) мастера, тогда надо использовать match full.

Собственно, simple, partial и full как раз покрывают все возможные варианты.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39209214
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvесли это надо исключить, и соответствовать только (2, null) мастера, тогда надо
использовать match full.
Авотфиг:
If some referencing column is null and another referencing column is nonnull, then
the row of the referencing table violates the constraint check .
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39209222
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

стандарт он такой как есть, теперь менять поздно. Для возмущающихся есть трекер, где можно пожелать предложение MATCH [SIMPLE | PARTIAL | FULL]. Но умолчательное поведение никто менять не будет.
...
Рейтинг: 0 / 0
Непонятки с null-able FOREIGN KEY
    #39209454
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящиймножественное наследование в ООП

казалось бы какая связь между OO-DBMS и SQL ? :-)
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Непонятки с null-able FOREIGN KEY
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]