|
INSERT OR REPLACE + trigger
|
|||
---|---|---|---|
#18+
Привет. Кто знает почему тут срабатывает 4 раза триггер на Insert? ведь при последующих INSERT OR REPLACE insert-а не происходит по идее должно быть или один Insert + 3 Update или insert + последовательности delete+insert Это баг? Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2016, 21:11 |
|
INSERT OR REPLACE + trigger
|
|||
---|---|---|---|
#18+
Может это такая "фича"... в документации что-то пишут про (не могу грамотно перевести): When the REPLACE conflict resolution strategy deletes rows in order to satisfy a constraint, delete triggers fire if and only if recursive triggers are enabled типо если REPLACE для удовлетворения конфиктов, всё же удаляет строки, тогда, чтобы сработал триггер на удаление, должно быть включено использование "рекурсивных триггеров". Но что-то всё равно не то ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2016, 22:03 |
|
INSERT OR REPLACE + trigger
|
|||
---|---|---|---|
#18+
хм. если поставить PRAGMA recursive_triggers = true; то ловится скрытая операция delete 1|2016-01-09 18:58:36|I 2|2016-01-09 18:58:36|I 3|2016-01-09 18:58:36|D 4|2016-01-09 18:58:36|I 5|2016-01-09 18:58:36|D 6|2016-01-09 18:58:36|I 7|2016-01-09 18:58:36|D Получается sqlite команду INSERT OR REPLACE выполняет не эффективно (чуть позже проведу тесты на больших объемах) т.е. сначала удаляет строку, а потом делает новую вставку при delete ведь выполняется ребилд индексов? почему он не делает update? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2016, 22:06 |
|
INSERT OR REPLACE + trigger
|
|||
---|---|---|---|
#18+
+ The update hook is not invoked for rows that are deleted by the REPLACE conflict resolution strategy. Nor does REPLACE increment the change counter. The exceptional behaviors defined in this paragraph might change in a future release. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2016, 22:06 |
|
INSERT OR REPLACE + trigger
|
|||
---|---|---|---|
#18+
Провел тест на таблице из 150 тыс записей. INSERT OR REPLACE INTO userinfo - 15 сек UPDATE userinfo set - 10 сек. Код теста Код: 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. 33. 34. 35. 36. 37. 38. 39. 40.
К сожалению получается, если запись в таблице существует использовать INSERT OR REPLACE не эффективно. пока заменил у себя критичные места на такой код 1. делаю update 2. считаю sqlite3_changes 3. если sqlite3_changes = 0 зову insert or replace replace - костыль для защиты от вставки такой записи другим процессом Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
У кого будут другие идеи - как сделать красивше? В идеале очень хотелось-бы получить от sqlite нативную команду "INSERT OR UPDATE" или "MERGE" которая не делает этот лишний Delete и всю модификацию выполняет атомарно без побочных эффектов в много поточной среде... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2016, 13:05 |
|
|
start [/forum/topic.php?fid=54&msg=39143939&tid=2008628]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 157ms |
0 / 0 |