Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Заполнить таблицу автоинкрементым значением / 25 сообщений из 27, страница 1 из 2
19.10.2017, 14:21
    #39538728
SQLWalker
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить таблицу автоинкрементым значением
Есть таблица на несколько тысяч записей.
Первичный ключ был на поле VARCHAR.
Надо добавить новое автоинкрементное поле (integer), которое затем станет первичным ключом для этой таблицы.
Но надо заполнить это поле автоинкрементными значениями перед тем, как менять первичный индекс.
Просьба помочь с кодом хранимой процедуры для заполнения поля уникальными автоинкрементными значениями.
...
Рейтинг: 0 / 0
19.10.2017, 14:27
    #39538734
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить таблицу автоинкрементым значением
UPDATE ... SET ... = GEN_ID(..., 1)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.10.2017, 14:33
    #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
19.10.2017, 14:45
    #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
19.10.2017, 14:50
    #39538760
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить таблицу автоинкрементым значением
SQLWalkerдумал, что before insert подходит только при вставке новой записи.

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

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

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

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

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

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

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

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

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

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

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

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

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

будет isc_primary_key_notnull .
и это правильно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.10.2017, 15:52
    #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
19.10.2017, 16:15
    #39538883
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить таблицу автоинкрементым значением
Гаджимурадов РустамНадо налабать ненужный апдейт-триггер

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

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

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

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

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

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

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

Но можно, конечно, и копипастить. Возможно так архитектурнее, "быдло" в такой тонкости не разбирается.
...
Рейтинг: 0 / 0
19.10.2017, 17:01
    #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
19.10.2017, 17:14
    #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
19.10.2017, 17:20
    #39538972
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить таблицу автоинкрементым значением
триггер на апдейт меняющий молчком ПК... это ж догадаться надо... есть вещи выше моего понимания.
...
Рейтинг: 0 / 0
19.10.2017, 17:20
    #39538974
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить таблицу автоинкрементым значением
Arioch> Ты старательно забываешь про аппликухи. В том числе - старых версий.

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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