powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Заполнить таблицу автоинкрементым значением
25 сообщений из 27, страница 1 из 2
Заполнить таблицу автоинкрементым значением
    #39538728
SQLWalker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица на несколько тысяч записей.
Первичный ключ был на поле VARCHAR.
Надо добавить новое автоинкрементное поле (integer), которое затем станет первичным ключом для этой таблицы.
Но надо заполнить это поле автоинкрементными значениями перед тем, как менять первичный индекс.
Просьба помочь с кодом хранимой процедуры для заполнения поля уникальными автоинкрементными значениями.
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538734
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UPDATE ... SET ... = GEN_ID(..., 1)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538740
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLWalker :

1) Создать генератор.
2) Создать тригер на before insert

Если именно нужно с применением ХП, тогда
BEGIN
for
select old_var_key
from my_table
into :var_key
do update my_table
set new_key_field=gen_id(MY_GEN_NAME,1)
where old_var_key=:var_key;

END
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538752
SQLWalker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое всем спасибо.
Заполнил как рекомендовали:
1. Создал генератор GEN_PK_CALLER_ID
2. Создал тригер на before insert
AS BEGIN
IF (NEW.CALLER_ID IS NULL) THEN NEW.CALLER_ID = GEN_ID(GEN_PK_CALLER_ID, 1);
END
3. Поле заполнилось одним запросом
UPDATE known_numbers SET CALLER_ID = GEN_ID(GEN_PK_CALLER_ID, 1);

Думал, что before insert подходит только при вставке новой записи.
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538760
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLWalkerдумал, что before insert подходит только при вставке новой записи.

так и есть, это тебе на будущее сразу запас сделали.

Хотя я бы делал триггер Before update or insert
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538761
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
19.10.2017 14:45, SQLWalker пишет:
> Думал, что before insert подходит только при вставке новой записи.

всё ты правильно думал.
триггер в данном конкретном случае нахрен не упал.
как и процедура.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538771
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий> триггер в данном конкретном случае нахрен не упал.

Ну он щас пойдёт и грохнет триггер. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538775
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochХотя я бы делал триггер Before update or insert

на хрена? Ты хочешь дёргать генератор при update?
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538778
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> на хрена? Ты хочешь дёргать генератор при update?

Да не, дело даже не в этом, генератор не дёрнется, ибо if не даст.
Дело в самом вывихе логики - ожидать, что апдейт-триггер как-то
может помочь заполнить PK. Ну лет через много может и поможет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538794
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисAriochХотя я бы делал триггер Before update or insert

на хрена? Ты хочешь дёргать генератор при update?

если в новое обязательное поле какая-то старая аппликуха впендюрила NULL - то почему нет?
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538801
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустаможидать, что апдейт-триггер как-то
может помочь заполнить PK

Поможет, если сделать update X set ID = ID

Только тут "приоритетность" задач обратная.

Сначала заводим триггер, как One True Way выставлять ID.
Изменяем структуру БД к новому правильному виду.

Затем заставляем стандартные триггер отработать старые записи - единообразия для.
Подтягиваем неправильные данные к правильной структуре.

Хотя современный FB не даст изменить структуру: добавление non-null столбюца без default value.
А генераторы и прочие выражения ЕМНИП в default не вставляются.
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538804
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
19.10.2017 15:20, Arioch пишет:
> если в новое обязательное поле какая-то старая аппликуха впендюрила NULL - то почему нет?

будет isc_primary_key_notnull .
и это правильно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538845
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch> если в новое обязательное поле какая-то старая
Arioch> аппликуха впендюрила NULL - то почему нет?

В PK? Ну то что МП про исключение подсказал -
это ещё ладно, полбеды. Но что, в таком случае
надо генератор по новой дёргать?!

Arioch> Поможет, если сделать update X set ID = ID

Ну т.е. вместо update set = GEN_ID надо налабать ненужный
апдейт-триггер и сделать update set ID = ID. Замечательно.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538883
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНадо налабать ненужный апдейт-триггер

С чего бы он ненужный?

Это стандартный триггер описанный в FAQ'ах лет уже 20 наверное как.
И ты это знаешь, но передёрнуть просто необходимо было.
Печально.
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538915
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch> С чего бы он ненужный?

Шо, и вправду триггеры на update PK юзаешь?!

> Это стандартный триггер описанный в FAQ'ах лет уже 20 наверное как.

Ась?! А ну-ка, ну-ка, расскажи-покажи мне этот FAQ
20-летней давности с before update or insert триггером...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538933
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Триггеры - на заполнение поле из генератора. Они стандартны и общеизвестны.
Я просто изменил условие вызова.
Не "налабал" новый триггер, как ты говоришь, а взял стандартный и изменил один флажок.
В этом твоё передергивание.

Насчет PK не помню. Но некоторые поля подобным триггером заполнялись, которые пустыми быть не должны. Вместо того, чтобы копипастить один и тот же код, он был вбит один раз в триггер.
После чего по таблице был пропущен update.

Но можно, конечно, и копипастить. Возможно так архитектурнее, "быдло" в такой тонкости не разбирается.
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538949
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch> Не "налабал" новый триггер, как ты говоришь, а взял стандартный и
Arioch> изменил один флажок. В этом твоё передергивание. Насчет PK не помню.

Уговорил, повернуться боком и делать прыжки в сторону -
это тоже движение. Возможно, это кому-то даже удобнее.


> Вместо того, чтобы копипастить один и тот же код, он был вбит один раз в триггер.
> После чего по таблице был пропущен update. Но можно, конечно, и копипастить.

О сколько нам открытий чудных!.. (с)
А ну-ка поподробнее - что там с копипастом?
Ну т.е. есть пустые поля, в них надо что-то
проставить (дату, сумму других полей - не суть).

Ты в таких случаях вместо update set =date, =a+b
всегда пишешь триггер if null then = date, =a+b и
потом вызываешь update table set nullfield=nullfield?!
Я всё правильно понял?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538965
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамТы в таких случаях вместо update set =date, =a+b
всегда пишешь триггер if null then = date, =a+b и

Ты старательно забываешь про аппликухи. В том числе - старых версий.

В моем случае - пишется один более-менее сложный триггер. И один холостой update.
Они оба вставляются в апдейтер, после добавления столбца.
Аппликухи можно вообще не трогать, если сервер сам может посчитать данные.

В твоём случае - триггер не пишется, а вместо него пишутся
1) сложный update с вычислением для апдейтера
2,3,4,...) такие же формулы в КАЖДУЮ аппликуху. Даже в те, которым эти данные не нужны. И если где-то аппликуху не обновили (бардак, но в жизни всякое бывает), от в базу лезут незаполненные столбцы

Конечно же, вторая архитектура красивее.
"Don't repeat yourself" быдло придумало.
А архитектор скопирует свой мудрый update в 10 аппликух - и за каждую отдельно оплату получит.
А за будущего мантейнера у него голова не болит, "такой задачи не поставлено".
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538972
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
триггер на апдейт меняющий молчком ПК... это ж догадаться надо... есть вещи выше моего понимания.
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538974
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch> Ты старательно забываешь про аппликухи. В том числе - старых версий.

А, ну да, уговорил.

> "Don't repeat yourself" быдло придумало.

Для быдла придумали KISS. Куда проще и универсальнее.

> 2,3,4,...) такие же формулы в КАЖДУЮ аппликуху.
> Даже в те, которым эти данные не нужны.
> А архитектор скопирует свой мудрый update в 10 аппликух

Зачем это всё? Как/зачем они вообще должны знать про новые поля?
Впрочем, я уже заранее знаю ответ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538977
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky> есть вещи выше моего понимания.

Конечно, есть. 10 старых аппликух, мсьё!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538982
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамКак/зачем они вообще должны знать про новые поля?

затем, чтобы изменяя другие столбцы этой таблицы, уметь пересчитать новый столбец.


но по твоему, аппликухам не нужно знать про новые поля, если они их не читают.
и я с этим согласен.

поэтому в моем, плохом, варианте - это сделает "ненужный" триггер.
в твоем - хорошем - этого не сделает сама аппликуха, и вообще не сделает никто.

и останутся в том столбце старые данные, необновлённые.
зато архитектура красивая. быдлу не понять.

Потому что извлечь данные из БД - задача отдельная от хранения данных, ага.
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538984
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevskyтриггер на апдейт меняющий молчком ПК

не меняющий, а заполняющий отсутствующий ПК
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538993
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochне меняющий, а заполняющий отсутствующий ПК

PK не может отсутствовать по определению самого РК. Firebird не даст его создать на
nullable поле.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Заполнить таблицу автоинкрементым значением
    #39538994
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch> затем, чтобы изменяя другие столбцы этой таблицы, уметь пересчитать новый столбец.

Это если новый столбец зависит от других изменяемых столбцов.
Что не касается PK и случаев типа date=current_date.

> в твоем - хорошем - этого не сделает сама аппликуха, и вообще не сделает никто.

Отчего же не сделает. Надо - сделает триггер/ХП.

Arioch> не меняющий, а заполняющий отсутствующий ПК

Update заполняет отсутствующий ПК? Я ничего не перепутал?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Заполнить таблицу автоинкрементым значением
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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