|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Есть таблица на несколько тысяч записей. Первичный ключ был на поле VARCHAR. Надо добавить новое автоинкрементное поле (integer), которое затем станет первичным ключом для этой таблицы. Но надо заполнить это поле автоинкрементными значениями перед тем, как менять первичный индекс. Просьба помочь с кодом хранимой процедуры для заполнения поля уникальными автоинкрементными значениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 14:21 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
UPDATE ... SET ... = GEN_ID(..., 1) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 14:27 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 14:33 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Большое всем спасибо. Заполнил как рекомендовали: 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 подходит только при вставке новой записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 14:45 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
SQLWalkerдумал, что before insert подходит только при вставке новой записи. так и есть, это тебе на будущее сразу запас сделали. Хотя я бы делал триггер Before update or insert ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 14:50 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
19.10.2017 14:45, SQLWalker пишет: > Думал, что before insert подходит только при вставке новой записи. всё ты правильно думал. триггер в данном конкретном случае нахрен не упал. как и процедура. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 14:51 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Мимопроходящий> триггер в данном конкретном случае нахрен не упал. Ну он щас пойдёт и грохнет триггер. :) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 14:58 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
AriochХотя я бы делал триггер Before update or insert на хрена? Ты хочешь дёргать генератор при update? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 15:01 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Симонов Денис> на хрена? Ты хочешь дёргать генератор при update? Да не, дело даже не в этом, генератор не дёрнется, ибо if не даст. Дело в самом вывихе логики - ожидать, что апдейт-триггер как-то может помочь заполнить PK. Ну лет через много может и поможет. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 15:03 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Симонов ДенисAriochХотя я бы делал триггер Before update or insert на хрена? Ты хочешь дёргать генератор при update? если в новое обязательное поле какая-то старая аппликуха впендюрила NULL - то почему нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 15:20 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустаможидать, что апдейт-триггер как-то может помочь заполнить PK Поможет, если сделать update X set ID = ID Только тут "приоритетность" задач обратная. Сначала заводим триггер, как One True Way выставлять ID. Изменяем структуру БД к новому правильному виду. Затем заставляем стандартные триггер отработать старые записи - единообразия для. Подтягиваем неправильные данные к правильной структуре. Хотя современный FB не даст изменить структуру: добавление non-null столбюца без default value. А генераторы и прочие выражения ЕМНИП в default не вставляются. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 15:25 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
19.10.2017 15:20, Arioch пишет: > если в новое обязательное поле какая-то старая аппликуха впендюрила NULL - то почему нет? будет isc_primary_key_notnull . и это правильно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 15:26 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 15:52 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамНадо налабать ненужный апдейт-триггер С чего бы он ненужный? Это стандартный триггер описанный в FAQ'ах лет уже 20 наверное как. И ты это знаешь, но передёрнуть просто необходимо было. Печально. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 16:15 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Arioch> С чего бы он ненужный? Шо, и вправду триггеры на update PK юзаешь?! > Это стандартный триггер описанный в FAQ'ах лет уже 20 наверное как. Ась?! А ну-ка, ну-ка, расскажи-покажи мне этот FAQ 20-летней давности с before update or insert триггером... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 16:36 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, Триггеры - на заполнение поле из генератора. Они стандартны и общеизвестны. Я просто изменил условие вызова. Не "налабал" новый триггер, как ты говоришь, а взял стандартный и изменил один флажок. В этом твоё передергивание. Насчет PK не помню. Но некоторые поля подобным триггером заполнялись, которые пустыми быть не должны. Вместо того, чтобы копипастить один и тот же код, он был вбит один раз в триггер. После чего по таблице был пропущен update. Но можно, конечно, и копипастить. Возможно так архитектурнее, "быдло" в такой тонкости не разбирается. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 16:52 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 17:01 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамТы в таких случаях вместо update set =date, =a+b всегда пишешь триггер if null then = date, =a+b и Ты старательно забываешь про аппликухи. В том числе - старых версий. В моем случае - пишется один более-менее сложный триггер. И один холостой update. Они оба вставляются в апдейтер, после добавления столбца. Аппликухи можно вообще не трогать, если сервер сам может посчитать данные. В твоём случае - триггер не пишется, а вместо него пишутся 1) сложный update с вычислением для апдейтера 2,3,4,...) такие же формулы в КАЖДУЮ аппликуху. Даже в те, которым эти данные не нужны. И если где-то аппликуху не обновили (бардак, но в жизни всякое бывает), от в базу лезут незаполненные столбцы Конечно же, вторая архитектура красивее. "Don't repeat yourself" быдло придумало. А архитектор скопирует свой мудрый update в 10 аппликух - и за каждую отдельно оплату получит. А за будущего мантейнера у него голова не болит, "такой задачи не поставлено". ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 17:14 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
триггер на апдейт меняющий молчком ПК... это ж догадаться надо... есть вещи выше моего понимания. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 17:20 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Arioch> Ты старательно забываешь про аппликухи. В том числе - старых версий. А, ну да, уговорил. > "Don't repeat yourself" быдло придумало. Для быдла придумали KISS. Куда проще и универсальнее. > 2,3,4,...) такие же формулы в КАЖДУЮ аппликуху. > Даже в те, которым эти данные не нужны. > А архитектор скопирует свой мудрый update в 10 аппликух Зачем это всё? Как/зачем они вообще должны знать про новые поля? Впрочем, я уже заранее знаю ответ. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 17:20 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky> есть вещи выше моего понимания. Конечно, есть. 10 старых аппликух, мсьё! Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 17:21 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамКак/зачем они вообще должны знать про новые поля? затем, чтобы изменяя другие столбцы этой таблицы, уметь пересчитать новый столбец. но по твоему, аппликухам не нужно знать про новые поля, если они их не читают. и я с этим согласен. поэтому в моем, плохом, варианте - это сделает "ненужный" триггер. в твоем - хорошем - этого не сделает сама аппликуха, и вообще не сделает никто. и останутся в том столбце старые данные, необновлённые. зато архитектура красивая. быдлу не понять. Потому что извлечь данные из БД - задача отдельная от хранения данных, ага. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 17:26 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Ivan_Pisarevskyтриггер на апдейт меняющий молчком ПК не меняющий, а заполняющий отсутствующий ПК ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 17:27 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Ariochне меняющий, а заполняющий отсутствующий ПК PK не может отсутствовать по определению самого РК. Firebird не даст его создать на nullable поле. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 17:30 |
|
Заполнить таблицу автоинкрементым значением
|
|||
---|---|---|---|
#18+
Arioch> затем, чтобы изменяя другие столбцы этой таблицы, уметь пересчитать новый столбец. Это если новый столбец зависит от других изменяемых столбцов. Что не касается PK и случаев типа date=current_date. > в твоем - хорошем - этого не сделает сама аппликуха, и вообще не сделает никто. Отчего же не сделает. Надо - сделает триггер/ХП. Arioch> не меняющий, а заполняющий отсутствующий ПК Update заполняет отсутствующий ПК? Я ничего не перепутал? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 17:31 |
|
|
start [/forum/moderation_log.php?user_name=vynt]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 446ms |
total: | 612ms |
0 / 0 |