|
Добавление foreign key
|
|||
---|---|---|---|
#18+
Приветствую знатоков и разработчиков! 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.
Пытаюсь добавить ключ Код: plsql 1.
Все видят - ключ есть, но сервер считает иначе: Код: plaintext 1. 2. 3. 4.
Почему - загадка.... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 01:40 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
ggreggory Почему - загадка.... По-моему дело в том, что вот это alter table main add ref_id varchar(1) default '1' not null; не обязывает сервер ни сувать в это поле default по всей таблице, ни подставлять его при чтении нулла. Более того, если туда спецом, то есть явно, при апдейте-инсёрте запихнут нулл, то нулл и будет, что вызовет ошибку нарушения констрейнта. Это обязывает сервер всего лишь писать дефолтное значение если в инсёрте поле не указано ваще. Единственно - с некоторых пор при создании бэкапа такой пердимонокль стал обслуживаться подстановкой туда дефолта вместо нуллов. Во избежание ситуаций разбитого корыта - базы нет, а бэкап-копия не ресторится из-за нуллов, оставшихся после создания поля на непустой таблице и забывчивости насчёт заполнения. А в сообщении об ошибке да, путаница. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 02:28 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
ggreggory> WI-V3.0.8.33535 Firebird 3.0 В 2.5 работает. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 10:49 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
СПМ> По-моему дело в том, что вот это > alter table main add ref_id varchar(1) default '1' not null; > не обязывает сервер ни сувать в это поле default по всей таблице Ну здрасьте... Заставляет. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 10:52 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам СПМ> По-моему дело в том, что вот это > alter table main add ref_id varchar(1) default '1' not null; > не обязывает сервер ни сувать в это поле default по всей таблице Ну здрасьте... Заставляет. с какой радости? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 10:58 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
dimitr> с какой радости? Не понял вопроса. Ты это серьёзно щас или прикалываешься? С такой радости, что это прописано в стандарте. Когда это было имплементировано в FB я не помню, но давно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 11:20 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
Или ты про разницу между изменением записей и изменением формата записи пытаешься сказать? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 11:36 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
Я хочу сказать, что ФБ никогда при добавлении поля ничего в него не писал. Дефолт всегда подставляется при чтении. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 11:40 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
Ну т.е. про формат, представление и пр. Но на FK-то это не должно влиять? Или должно? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 12:04 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамС такой радости, что это прописано в стандарте. Цитату из стандарта, где он предписывает при таком alter проводить полный update по всей таблице - В СТУДИЮ! Ну или сразу в трекер. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 13:43 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
Вообще изначально всё было как я изложил. Потом подстановку при создании бэкапа внедрила, если мне не изменяет склероз, бабушка Аня, под вопли страдальцев-ушохлопов. Нет, пожалуй, я слишком строг, на самом деле не только таковых, нулл в нот нулл поле может быть результатом повреждения базы. Когда подстановку ввели для чтения вообще, я, видимо, уже не застал и потому не в курсе. Судя по рассматриваемому примеру, ввели кривовато. Я вообще против всяких - здесь читаем, здесь не читаем, здесь рыбу заворачивали, программист должен видеть реальное положение вещей, а не фантазии неестественного интеллекта. Я так думаю (С) Рубик джан. Дефолт имхо нужен вообще только для атрибутики, связанной с арифметикой, чтоб не нуллить выражения с участием поля и не запутывать окончательно ситуацию со значениями связанных с этим полем полей других таблиц, и для статусных-признаковых полей. Для ФК допустИм в качестве значения ссылки на запись "Не определено" в справочнике, и ФСЁ, по Дейту, так сказать. А в общем случае новое поле - это не выскочивший сам собой прыщ. Его появление связано либо с недочётами изначального проектирования в плане неполноты модели предметной области, либо с расширением оной, государствие наше, например, самозабвенно предается законотворчеству. Художники, нехорошая женщина. Оно должно быть заполнено на основании некоторой сторонней для первоначальной модели информации, как правило, в несколько проходов. И тут какое умолчание ни придумай, оно будет иметь право на совпадение с осмысленным результатом такого заполнения и необслуженную запись будет не отличить от обслуженной. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 13:46 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, мне сложно дать какие-либо комментарии с учетом того, что приведенный ТС пример у меня выполняется без ошибок и на 3.0.8 и на 4.0. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 13:46 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Гаджимурадов РустамС такой радости, что это прописано в стандарте. Цитату из стандарта, где он предписывает при таком alter проводить полный update по всей таблице - В СТУДИЮ! Ну или сразу в трекер. Гыыы. Представляю себе при этом перекур после введения поля с дефолтом на табличке эдак с полмиллиардом записей :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 13:48 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
Они в стандарте хитро отмазались: " Let C be the column added to T. [...] every value in C is the default value for C ". Где именно оно " is " каждый понимает в меру своей испорченности :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 13:59 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
dimitr Гаджимурадов Рустам, мне сложно дать какие-либо комментарии с учетом того, что приведенный ТС пример у меня выполняется без ошибок и на 3.0.8 и на 4.0. Во вложении файл базы до "alter table main add constraint FK_MAIN foreign key (ref_id) references ref (id)". Ошибка выдается не на выполнении статмента, а на коммите. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 14:01 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
dimitr Гаджимурадов Рустам, мне сложно дать какие-либо комментарии с учетом того, что приведенный ТС пример у меня выполняется без ошибок и на 3.0.8 и на 4.0. И скриншот с этим файлом: ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 14:12 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
ggreggoryОшибка выдается не на выполнении статмента, а на коммите. госпидя... - индекс (ФК, ПК, и вообще) создается по коммиту. - индекс индексирует ЗАПИСИ и версии. А не дефолты. - в записи main(str='X', ref_id = null). кабздец. p.s. "И скриншот с этим файлом:" Вот интересно, почему нельзя из CMD просто скопировать текст, надо обязательно КАРТИНКУ прикладывать. Чтобы если потребуется, нельзя было оттуда ничего скопировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 15:48 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
kdv - индекс индексирует ЗАПИСИ и версии. А не дефолты. - в записи main(str='X', ref_id = null). А что, интересно было бы знать (С) Пятачок, в FB3 покажет селект этой записи? Дефолт? ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 16:15 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 16:20 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
Ну да. И не только в FB3. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 16:21 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
hvlad Всё работает как и должно работать. И чарсет UTF8 ? Я вложил тестовую базу в предыдущем сообщении. Вы на ней пробовали? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 16:25 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
kdv Вот интересно, почему нельзя из CMD просто скопировать текст, надо обязательно КАРТИНКУ прикладывать. Чтобы если потребуется, нельзя было оттуда ничего скопировать? А почему нет?! Текст примера есть в самом первом сообщении! Тут ведь пошел спор, что у других проблема не воспроизводится. Какие ещё формы доказательств мне предоставить?! Базу выложил!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 16:41 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
ggreggory, во-первых, зачем ПК и ФК varchar. Понятно, что бывает, но лучше не надо (разве что исключение - guid). во-вторых, как я уже сказал, индекс индексирует записи и версии. У тебя в записи null, к столбцу сделан default. Понятно что при select будет выводиться default. Но физически в записи - null, до тех пор пока этому столбцу не будет сделан апдейт каким-то значением. В третьих, даже если Влад написал, что это таки-работает, всё равно индексировать дефолт (определение, а не запись) как-то неправильно. Что будет, если мы после создания такого ФК грохнем дефолт. Понятно, что так-то ничего не изменится - в ключе '1' ссылается на номер записи. Или ключ null ссылается на номер записи? Видимо, всё-таки 1, потому что при чтении записи null будет заменяться на default. А вот если мы грохнем default, вот будет веселуха для записей, где остался null. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 16:42 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
ggreggory hvlad Всё работает как и должно работать. И чарсет UTF8 ? Напишешь трекеру ? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 16:45 |
|
Добавление foreign key
|
|||
---|---|---|---|
#18+
kdv ggreggory, во-первых, зачем ПК и ФК varchar. Понятно, что бывает, но лучше не надо (разве что исключение - guid). во-вторых, как я уже сказал, индекс индексирует записи и версии. У тебя в записи null, к столбцу сделан default. Понятно что при select будет выводиться default. Но физически в записи - null, до тех пор пока этому столбцу не будет сделан апдейт каким-то значением. В третьих, даже если Влад написал, что это таки-работает, всё равно индексировать дефолт (определение, а не запись) как-то неправильно. Что будет, если мы после создания такого ФК грохнем дефолт. Понятно, что так-то ничего не изменится - в ключе '1' ссылается на номер записи. Или ключ null ссылается на номер записи? Видимо, всё-таки 1, потому что при чтении записи null будет заменяться на default. А вот если мы грохнем default, вот будет веселуха для записей, где остался null. А я говорил, я пердуперждал С примерчиком из одной записи ладно, а вот в реальной относительно сложной системе устроить себе, любимому, по оплошности такую залипуху - это ж повеситься этот нулл искать, когда тебе его не показывают. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2021, 17:35 |
|
|
start [/forum/topic.php?fid=40&msg=40117474&tid=1559841]: |
0ms |
get settings: |
16ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
438ms |
get tp. blocked users: |
1ms |
others: | 365ms |
total: | 896ms |
0 / 0 |