Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Непонятки с null-able FOREIGN KEY / 25 сообщений из 38, страница 1 из 2
05.04.2016, 12:06
    #39208223
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с null-able FOREIGN KEY
Привет всем.

Есть родительская таблица 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
05.04.2016, 12:10
    #39208230
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с null-able FOREIGN KEY
Polesov,

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

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

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

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

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

Если правильно, то будет использована другая схема FK (менее подходящая, надо сказать).
А если нет, то возможно будет исправлена еще одна ошибка.
...
Рейтинг: 0 / 0
05.04.2016, 12:49
    #39208290
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с null-able FOREIGN KEY
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
05.04.2016, 13:03
    #39208308
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с null-able FOREIGN KEY
Симонов ДенисИ всё же интересно откуда такая идея возникла.
Все немного по другому - надо обрабатывать валидность внешних данных по значениям различных типов FK.
При обработке такого типа FK из-за ошибки в алгоритме данные были записаны, что и породило тест-кейс из старт-топика.
...
Рейтинг: 0 / 0
05.04.2016, 13:19
    #39208329
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с null-able FOREIGN KEY
Polesov,

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

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

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

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
05.04.2016, 13:33
    #39208356
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с null-able FOREIGN KEY
Кстати, в связи с 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
05.04.2016, 13:41
    #39208363
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с null-able FOREIGN KEY
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
05.04.2016, 14:15
    #39208391
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с null-able FOREIGN KEY
Симонов Денися тебе более простой примерчик придумал

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

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

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

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

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

Симонов Денис> ладно подождём что скажут dimitr и hvlad. Надо бы ещё узнать что об этом думает стандарт.
обсуждалось лет 10 тому назад.
но не на сруле, если не ошибаюсь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.04.2016, 14:52
    #39208433
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с null-able FOREIGN KEY
все по стандарту
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
05.04.2016, 14:57
    #39208440
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с null-able FOREIGN KEY
Polesov,

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

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


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