powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Непонятки с null-able FOREIGN KEY
25 сообщений из 38, страница 1 из 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
25 сообщений из 38, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Непонятки с null-able FOREIGN KEY
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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