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

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
Добавление foreign key
    #40117412
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggreggory

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


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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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


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

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

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

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


А что, интересно было бы знать (С) Пятачок, в FB3 покажет селект этой записи? Дефолт? ;)
...
Рейтинг: 0 / 0
Добавление foreign key
    #40117468
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Добавление foreign key
    #40117469
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да. И не только в FB3.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Добавление foreign key
    #40117470
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad
Всё работает как и должно работать.


И чарсет UTF8 ?

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

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


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

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

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


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

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

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


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


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