Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос по on duplicate в таблице с auto_increment
|
|||
|---|---|---|---|
|
#18+
Есть БД, например с такой таблицей: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Есть скрипт, который синхронизирует эту БД с другой БД, используя SQL-запросы примерно такого вида: Код: sql 1. 2. Скрипт довольно долго работал нормально, а сегодня вдруг сломался. Как оказалось, счетчик auto_increment превысил 2 миллиарда и сгенерированное значение нельзя вставить в поле CODE из-за переполнения. В качестве временного решения я для поля CODE поменял тип данных на bigint, сейчас скрипт снова работает нормально. Есть еще несколько подобных мест, но там счетчик пока до 2 миллиардов не дошел и вмешательство не требуется. Я как бы озадачен. Скрипт синхронизации запускается каждые 5 минут, объем вставляемых данных при каждом запуске порядка 5-8к записей, однако 99% этих данных уже существуют в конечной БД и должны не вставляться, а обновляться. Однако исходя из значения счетчика, похоже что счетчик увеличивается при каждой попытке insert, даже если срабатывает on duplicate key. Выглядит бредово, но других объяснений я пока не вижу. Это возможно? Или все же нужно более подробно изучать скрипт синхронизации и искать ошибки в нем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2017, 13:39 |
|
||
|
Вопрос по on duplicate в таблице с auto_increment
|
|||
|---|---|---|---|
|
#18+
Alibek B., сначала увеличивается автоинкремент, только потом проверяются уникальные индексы и соответственно там срабатывает on duplicate. Может у вас BILLCODE & USERCODE должен быть первичным ключом вообще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2017, 13:48 |
|
||
|
Вопрос по on duplicate в таблице с auto_increment
|
|||
|---|---|---|---|
|
#18+
Фактически это уникальный ключ (индекс FULLCODE добавил уже я), однако сделать эти поля первичным ключом во всей информационной системе я не смогу, ее нужно будет переписывать. Понятно, значит придется переделывать скрипт синхронизации, чтобы он делал отдельно update и отдельно insert. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2017, 13:52 |
|
||
|
Вопрос по on duplicate в таблице с auto_increment
|
|||
|---|---|---|---|
|
#18+
Alibek B. , я бы предложил заменить INSERT .. ODKU на REPLACE. И текст будет короче, и параметры дублировать не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2017, 14:14 |
|
||
|
Вопрос по on duplicate в таблице с auto_increment
|
|||
|---|---|---|---|
|
#18+
Оператор REPLACE работает точно так же, как INSERT, за исключением того, что если старая запись в данной таблице имеет то же значение индекса UNIQUE или PRIMARY KEY, что и новая, то старая запись перед занесением новой будет удалена. Насколько я понимаю, проблему с быстрым ростом счетчика это все равно не решит. Так что мне в любом случае придется переделывать скрипт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2017, 14:23 |
|
||
|
Вопрос по on duplicate в таблице с auto_increment
|
|||
|---|---|---|---|
|
#18+
Alibek B.Насколько я понимаю, проблему с быстрым ростом счетчика это все равно не решит. Да. Но те не менее сравни: Код: sql 1. 2. Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2017, 14:27 |
|
||
|
Вопрос по on duplicate в таблице с auto_increment
|
|||
|---|---|---|---|
|
#18+
Согласен, что replace лучше, чем insert ... on duplicate key. Но получается так, что в таблице со счетчиком их использовать нельзя. Я их использовал, чтобы на клиенте (скрипте) не заморачиваться с проверкой, существует ли уже такая запись. Но выходит, что придется заморочиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2017, 14:34 |
|
||
|
Вопрос по on duplicate в таблице с auto_increment
|
|||
|---|---|---|---|
|
#18+
Akina, Разве у replace не поплывёт сам счётчик? У строки же будет новый автоинкремент на каждом обновлении. Ну а если это ок - то выкинуть к чертям автоинкремент. Упаковать вместо него в bigint USERCODE со смещением в 4 байта плюс BILLCODE, раз уж приложению это поле нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2017, 14:37 |
|
||
|
Вопрос по on duplicate в таблице с auto_increment
|
|||
|---|---|---|---|
|
#18+
MelkijРазве у replace не поплывёт сам счётчик? У строки же будет новый автоинкремент на каждом обновлении.А у него этот счётчик - декоративный. И зачем существует, вообще непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2017, 14:41 |
|
||
|
Вопрос по on duplicate в таблице с auto_increment
|
|||
|---|---|---|---|
|
#18+
Приложение, которое использует эту БД, написано не мной. Оно использует поле CODE, так что выкинуть поле нельзя. А если убрать счетчик - нужно будет озаботиться тем, чтобы генерировать уникальный CODE при вставке новой записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2017, 15:51 |
|
||
|
Вопрос по on duplicate в таблице с auto_increment
|
|||
|---|---|---|---|
|
#18+
Alibek B., так у вас же уже есть 64-битный уникальный идентификатор. Зачем ещё что-то изобретать? Разобраться только с null'ами. Скорей всего их там быть всё равно не может, но по ddl сейчас допускаются. Если версия базы позволяет - то можно generated column сделать вместо физического поля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2017, 15:57 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39468806&tid=1830624]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 362ms |

| 0 / 0 |
