Гость
Map
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Добавление foreign key / 25 сообщений из 52, страница 1 из 3
05.12.2021, 01:40
    #40117406
ggreggory
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
Приветствую знатоков и разработчиков!

WI-V3.0.8.33535 Firebird 3.0

Пустая новенькая база, Superserver, всё дефолтное, charset UTF8, один юзер (я), локальное подключение. Элементарнейший пример:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table main (str varchar(1));
commit;

insert into main(str) values ('X');
commit;

create table ref (id varchar(1) not null primary key);
commit;

insert into ref(id) values ('1');
commit;

alter table main add ref_id varchar(1) default '1' not null;
commit;



Пытаюсь добавить ключ

Код: plsql
1.
alter table main add constraint FK_MAIN foreign key (ref_id) references ref (id)



Все видят - ключ есть, но сервер считает иначе:

Код: plaintext
1.
2.
3.
4.
Cannot commit transaction:
violation of FOREIGN KEY constraint "".
violation of FOREIGN KEY constraint "FK_MAIN" on table "MAIN".
Foreign key reference target does not exist.
Problematic key value is ("REF_ID" = '1')

Почему - загадка....
...
Рейтинг: 0 / 0
05.12.2021, 02:28
    #40117412
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
ggreggory

Почему - загадка....


По-моему дело в том, что вот это
alter table main add ref_id varchar(1) default '1' not null;
не обязывает сервер ни сувать в это поле default по всей таблице, ни подставлять его при чтении нулла. Более того, если туда спецом, то есть явно, при апдейте-инсёрте запихнут нулл, то нулл и будет, что вызовет ошибку нарушения констрейнта. Это обязывает сервер всего лишь писать дефолтное значение если в инсёрте поле не указано ваще. Единственно - с некоторых пор при создании бэкапа такой пердимонокль стал обслуживаться подстановкой туда дефолта вместо нуллов. Во избежание ситуаций разбитого корыта - базы нет, а бэкап-копия не ресторится из-за нуллов, оставшихся после создания поля на непустой таблице и забывчивости насчёт заполнения. А в сообщении об ошибке да, путаница.
...
Рейтинг: 0 / 0
05.12.2021, 10:49
    #40117423
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
ggreggory> WI-V3.0.8.33535 Firebird 3.0

В 2.5 работает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2021, 10:52
    #40117424
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
СПМ> По-моему дело в том, что вот это
> alter table main add ref_id varchar(1) default '1' not null;
> не обязывает сервер ни сувать в это поле default по всей таблице

Ну здрасьте... Заставляет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2021, 10:58
    #40117425
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
Гаджимурадов Рустам
СПМ> По-моему дело в том, что вот это
> alter table main add ref_id varchar(1) default '1' not null;
> не обязывает сервер ни сувать в это поле default по всей таблице

Ну здрасьте... Заставляет.

с какой радости?
...
Рейтинг: 0 / 0
05.12.2021, 11:20
    #40117429
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
dimitr> с какой радости?

Не понял вопроса. Ты это серьёзно щас или прикалываешься?
С такой радости, что это прописано в стандарте.
Когда это было имплементировано в FB я не помню, но давно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2021, 11:36
    #40117430
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
Или ты про разницу между изменением записей и
изменением формата записи пытаешься сказать?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2021, 11:40
    #40117432
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
Я хочу сказать, что ФБ никогда при добавлении поля ничего в него не писал. Дефолт всегда подставляется при чтении.
...
Рейтинг: 0 / 0
05.12.2021, 12:04
    #40117435
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
Ну т.е. про формат, представление и пр.
Но на FK-то это не должно влиять?

Или должно?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2021, 13:43
    #40117445
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
Гаджимурадов РустамС такой радости, что это прописано в стандарте.

Цитату из стандарта, где он предписывает при таком alter проводить полный update
по всей таблице - В СТУДИЮ! Ну или сразу в трекер.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2021, 13:46
    #40117446
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
Вообще изначально всё было как я изложил. Потом подстановку при создании бэкапа внедрила, если мне не изменяет склероз, бабушка Аня, под вопли страдальцев-ушохлопов. Нет, пожалуй, я слишком строг, на самом деле не только таковых, нулл в нот нулл поле может быть результатом повреждения базы. Когда подстановку ввели для чтения вообще, я, видимо, уже не застал и потому не в курсе. Судя по рассматриваемому примеру, ввели кривовато. Я вообще против всяких - здесь читаем, здесь не читаем, здесь рыбу заворачивали, программист должен видеть реальное положение вещей, а не фантазии неестественного интеллекта. Я так думаю (С) Рубик джан. Дефолт имхо нужен вообще только для атрибутики, связанной с арифметикой, чтоб не нуллить выражения с участием поля и не запутывать окончательно ситуацию со значениями связанных с этим полем полей других таблиц, и для статусных-признаковых полей. Для ФК допустИм в качестве значения ссылки на запись "Не определено" в справочнике, и ФСЁ, по Дейту, так сказать. А в общем случае новое поле - это не выскочивший сам собой прыщ. Его появление связано либо с недочётами изначального проектирования в плане неполноты модели предметной области, либо с расширением оной, государствие наше, например, самозабвенно предается законотворчеству. Художники, нехорошая женщина. Оно должно быть заполнено на основании некоторой сторонней для первоначальной модели информации, как правило, в несколько проходов. И тут какое умолчание ни придумай, оно будет иметь право на совпадение с осмысленным результатом такого заполнения и необслуженную запись будет не отличить от обслуженной.
...
Рейтинг: 0 / 0
05.12.2021, 13:46
    #40117447
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
Гаджимурадов Рустам,

мне сложно дать какие-либо комментарии с учетом того, что приведенный ТС пример у меня выполняется без ошибок и на 3.0.8 и на 4.0.
...
Рейтинг: 0 / 0
05.12.2021, 13:48
    #40117448
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
Dimitry Sibiryakov

Гаджимурадов РустамС такой радости, что это прописано в стандарте.

Цитату из стандарта, где он предписывает при таком alter проводить полный update
по всей таблице - В СТУДИЮ! Ну или сразу в трекер.


Гыыы. Представляю себе при этом перекур после введения поля с дефолтом на табличке эдак с полмиллиардом записей :)
...
Рейтинг: 0 / 0
05.12.2021, 13:59
    #40117449
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
Они в стандарте хитро отмазались: " Let C be the column added to T. [...] every value in C is the default value for C ". Где именно оно " is " каждый понимает в меру своей испорченности :-)
...
Рейтинг: 0 / 0
05.12.2021, 14:01
    #40117450
ggreggory
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
dimitr
Гаджимурадов Рустам,

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


Во вложении файл базы до "alter table main add constraint FK_MAIN foreign key (ref_id) references ref (id)".

Ошибка выдается не на выполнении статмента, а на коммите.
...
Рейтинг: 0 / 0
05.12.2021, 14:12
    #40117453
ggreggory
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
dimitr
Гаджимурадов Рустам,

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


И скриншот с этим файлом:
...
Рейтинг: 0 / 0
05.12.2021, 15:48
    #40117464
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
ggreggoryОшибка выдается не на выполнении статмента, а на коммите.
госпидя...

- индекс (ФК, ПК, и вообще) создается по коммиту.
- индекс индексирует ЗАПИСИ и версии. А не дефолты.
- в записи main(str='X', ref_id = null).
кабздец.

p.s. "И скриншот с этим файлом:"
Вот интересно, почему нельзя из CMD просто скопировать текст, надо обязательно КАРТИНКУ прикладывать. Чтобы если потребуется, нельзя было оттуда ничего скопировать?
...
Рейтинг: 0 / 0
05.12.2021, 16:15
    #40117466
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
kdv

- индекс индексирует ЗАПИСИ и версии. А не дефолты.
- в записи main(str='X', ref_id = null).


А что, интересно было бы знать (С) Пятачок, в FB3 покажет селект этой записи? Дефолт? ;)
...
Рейтинг: 0 / 0
05.12.2021, 16:20
    #40117468
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
ggreggory,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
firebird>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 'inet://z:\temp\fk.fdb';
SQL>
SQL> show version;
ISQL Version: WI-V3.0.8.33524 Firebird 3.0
Server version:
Firebird/Windows/AMD/Intel/x64 (access method), version "WI-V3.0.8.33533 Firebird 3.0"
Firebird/Windows/AMD/Intel/x64 (remote server), version "WI-V3.0.8.33533 Firebird 3.0/tcp (Win7x64)/P15:C"
Firebird/Windows/AMD/Intel/x64 (remote interface), version "WI-V3.0.8.33533 Firebird 3.0/tcp (Win7x64)/P15:C"
on disk structure version 12.0
SQL>
SQL> create table main (str varchar(1));
SQL> commit;
SQL>
SQL> insert into main(str) values ('X');
SQL> commit;
SQL>
SQL> create table ref (id varchar(1) not null primary key);
SQL> commit;
SQL>
SQL> insert into ref(id) values ('1');
SQL> commit;
SQL>
SQL> alter table main add ref_id varchar(1) default '1' not null;
SQL> commit;
SQL>
SQL> alter table main add constraint FK_MAIN foreign key (ref_id) references ref (id);
SQL> commit;
SQL>
SQL> drop database;
SQL> exit;
Всё работает как и должно работать.
...
Рейтинг: 0 / 0
05.12.2021, 16:21
    #40117469
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
Ну да. И не только в FB3.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2021, 16:25
    #40117470
ggreggory
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
hvlad
Всё работает как и должно работать.


И чарсет UTF8 ?

Я вложил тестовую базу в предыдущем сообщении. Вы на ней пробовали?
...
Рейтинг: 0 / 0
05.12.2021, 16:41
    #40117472
ggreggory
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
kdv

Вот интересно, почему нельзя из CMD просто скопировать текст, надо обязательно КАРТИНКУ прикладывать. Чтобы если потребуется, нельзя было оттуда ничего скопировать?


А почему нет?! Текст примера есть в самом первом сообщении! Тут ведь пошел спор, что у других проблема не воспроизводится. Какие ещё формы доказательств мне предоставить?! Базу выложил!!!
...
Рейтинг: 0 / 0
05.12.2021, 16:42
    #40117474
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
ggreggory,

во-первых, зачем ПК и ФК varchar. Понятно, что бывает, но лучше не надо (разве что исключение - guid).
во-вторых, как я уже сказал, индекс индексирует записи и версии. У тебя в записи null, к столбцу сделан default.
Понятно что при select будет выводиться default. Но физически в записи - null, до тех пор пока этому столбцу не будет сделан апдейт каким-то значением.

В третьих, даже если Влад написал, что это таки-работает, всё равно индексировать дефолт (определение, а не запись) как-то неправильно. Что будет, если мы после создания такого ФК грохнем дефолт. Понятно, что так-то ничего не изменится - в ключе '1' ссылается на номер записи. Или ключ null ссылается на номер записи? Видимо, всё-таки 1, потому что при чтении записи null будет заменяться на default. А вот если мы грохнем default, вот будет веселуха для записей, где остался null.
...
Рейтинг: 0 / 0
05.12.2021, 16:45
    #40117476
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
ggreggory
hvlad
Всё работает как и должно работать.


И чарсет UTF8 ?
А вот с utf8 действительно есть проблема.
Напишешь трекеру ?
...
Рейтинг: 0 / 0
05.12.2021, 17:35
    #40117489
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление foreign key
kdv
ggreggory,

во-первых, зачем ПК и ФК varchar. Понятно, что бывает, но лучше не надо (разве что исключение - guid).
во-вторых, как я уже сказал, индекс индексирует записи и версии. У тебя в записи null, к столбцу сделан default.
Понятно что при select будет выводиться default. Но физически в записи - null, до тех пор пока этому столбцу не будет сделан апдейт каким-то значением.

В третьих, даже если Влад написал, что это таки-работает, всё равно индексировать дефолт (определение, а не запись) как-то неправильно. Что будет, если мы после создания такого ФК грохнем дефолт. Понятно, что так-то ничего не изменится - в ключе '1' ссылается на номер записи. Или ключ null ссылается на номер записи? Видимо, всё-таки 1, потому что при чтении записи null будет заменяться на default. А вот если мы грохнем default, вот будет веселуха для записей, где остался null.


А я говорил, я пердуперждал С примерчиком из одной записи ладно, а вот в реальной относительно сложной системе устроить себе, любимому, по оплошности такую залипуху - это ж повеситься этот нулл искать, когда тебе его не показывают.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Добавление foreign key / 25 сообщений из 52, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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