|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
Добрый день, всем. Подскажите как правильно отработать такую задачу. Есть такая таблица (система тарифов) Код: sql 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.
Это таблица тарифов на жилищно-коммунальные услуги. По ключевым полям: DATA_TR, DATA_E, DATA_R, NUMB, TARN может быть десятки строк. У текущей, действующей, системы тарифов DATA_E is null. Нужно добавить новые тарифы. В целом задача сводится к тому что нужно сделать копию ВСЕХ строчек действующей системы тарифов (DATA_E is null) с установкой новой DATA_TR (указывается пользователем) и DATA_R равную СЕГОДНЯ. У "старой" системы тарифов нужно установить DATA_E=(текущая дата-1). Порядок моих действий: 1. У действующей системы нужно установить DATA_E=текущая дата-1, предварительно сохранив в переменные DATA_TR, DATA_R, NUMB, TARN. 2. Теперь делаю insert record ... from select ... where (data_tr=:data_tr)and(data_r=:data_r)and(numb=:numb)and(tarn=:tarn). Делаю это без выборки поля DATA_E, чтобы ему прописался NULL 3. После добавления мне нужно изменить DATA_TR и DATA_R. Правильный ли порядок действий. И возможно ли объединить п.2 и п.3, например делая инсерт в хранимой процедуре с заменой необходимых дат. Или еще лучше - все пункты объединить в ХП Такое возможно???? Я не прошу писать ХП. Если это возможно - я сам напишу и покажу ХП для получения советов. -------------------------- Firebird 3.0.1.32609; IBExpert 2017.2.7.1; Windows 10 32-bit; 4Gb RAM; SSD 512Mb + HDD 1 Tb; Настройки по умолчанию ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 11:27 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrush, Можно написать триггер на Insert. В этом триггере отработать нужные изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 12:17 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
KreatorXXI, А в тригер можно передать, в данном случае, даты которые нужно установить? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 12:22 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrushА в тригер можно передать, в данном случае, даты которые нужно установить? Триггер при вставке и изменении строки имеет доступ к новым и старым данным. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 12:32 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
wadman, Это хорошо, но мне нужно установить DATA_TR ту которую ввел пользователь. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 12:53 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrushЭто хорошо, но мне нужно установить DATA_TR ту которую ввел пользователь. Эта дата будет в новых данных. https://firebirdsql.org/refdocs/langrefupd21-ddl-trigger.html см new.* и old.* ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 13:01 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrush, В одной тр-ции: Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 13:10 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
wadman, Если делать инсерт уже с нужными датами, то и тригер мне писать не нужно. Суть вопроса была в чем. По отдельности я могу выполнить все пункты поочереди. Возможно ли их объединить, например в ХП? Пробую писать ХП - не получается. Делаю так: Код: sql 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71.
Ругается что "неизвестная колонка in_data_e". Что делаю неправильно? Если вообще подобное можно уместить в ХП. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 13:13 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrushРугается что "неизвестная колонка in_data_e". Что делаю неправильно?Двоеточие забыл ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 13:14 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrushЕсли делать инсерт уже с нужными датами, то и тригер мне писать не нужно. Нужно, просто ты не понимаешь, о чем я. :) 1. Делаешь вставку с новым тарифом. 2. Триггер перед вставкой закрывает текущий тариф. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 13:57 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
Сделал через ХП Код: sql 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64.
502 строчки изменяется/добавляется за 3-5 сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 14:50 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
Долго. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 14:55 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrush502 строчки изменяется/добавляется за 3-5 сек. это медлено ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 14:58 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
Симонов Денис, т.е. 502 строчки прописать дату_е и 502 строчки добавить за 3-5 сек. долго? Суммарно, редактируется/добавляется, 1004 строки. А как можно ускорить. Тут советовали через тригер, но я увы пока не могу понять как это правильно реализовать. Перебирать через делфи 502 строки и гнать запрос на добавление (с параметрами) и еще тригером у старой строки менять дату_е. Мне кажется будет дольше, т.к. 502 строки в данном случае должны уйти сначала на клиента, а потом назад. Или я совсем запутался :( ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 15:10 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrush, А чего непонятного. Пишешь запрос "insert into ... select ...". А в триггере пишешь свой код для update. Переменные с двоеточиями будут только с префиксом new. В принципе должно получиться компактней. На скорость, скорее всего, мало повлияет. Посмотри анализ запроса, возможно индекса какого не хватает (отдельно по селекту и отдельно по апдейту). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 15:46 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrush> т.е. 502 строчки прописать дату_е > и 502 строчки добавить за 3-5 сек. долго? Конечно. Очень долго. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 16:30 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
Собсно, ты же сам недавно 2 ляма за 20 минут импортил с обработкой - даже эта медленная скорость кратно выше, чем 500 записей за 5 сек. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 16:33 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrush....А как можно ускорить..... прочитай внимательно что hvlad написал 20289252 (при желании можешь и в процедуру это вкатать, вместо того что ты там написал) зы. и так, занудства ради в структуре таблицы нет ни первичного ключа ни уникального индекса (что может быть аукнется впоследствии в самый неподходящий момент) или ты их экономии ради не показал здесь ...... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 17:10 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
m7m, Их пока нет. То что я привел - это то что существует. Можно сделать и уникальный индекс, но он получится по полям: DATA_TR DATE NOT NULL, DATA_E DATE, DATA_R DATE NOT NULL, NUMB SMALLINT, TARN SMALLINT, COD_POSL SMALLINT, COD_RIZN SMALLINT, Не много для индекса? А сообщение Влада только понял что он имел ввиду. Днем голова сильно "бо-бо" наверное сразу не понял что Влад имел ввиду. Сейчас попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 17:23 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrush, ну тогда не удивительно, что у тебя медленно работает ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 17:30 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
Симонов Денисakrush, ну тогда не удивительно, что у тебя медленно работает Денис, индекса еще нет. только те которые в первом посте. Какой индекс посоветуете создать. Приведенные выше поля - в совокупности дают уникальную запись ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 18:26 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
Влад, огромное спасибо. Благодаря подсказке время обработки тех же 502+502 строчки - 0сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 18:27 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrush> Приведенные выше поля - в совокупности дают уникальную запись Почитай про искусственные (суррогатные) ключи. Про это есть куча статей и обсуждений. Большинство разработчиков при создании таблицы указывают первое поле Id уже чисто автоматически. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 18:40 |
|
Как правильно произвести Insert
|
|||
---|---|---|---|
#18+
akrush> Благодаря подсказке время обработки тех же 502+502 строчки - 0сек. Всё равно даже с той ХП - очень медленно. Надо смотреть почему, индексов нет или т.п. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2017, 18:41 |
|
|
start [/forum/topic.php?fid=40&fpage=47&tid=1561673]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
115ms |
get tp. blocked users: |
2ms |
others: | 289ms |
total: | 510ms |
0 / 0 |