Как предотвратить сброс значения mysql AUTO_INCREMENT при перезагрузке сервера? [Дубликат]

Невозможность связывания с соответствующими библиотеками / объектными файлами или компиляция файлов реализации

Обычно каждая единица перевода генерирует объектный файл, содержащий определения символов, определенных в этой единицы перевода. Чтобы использовать эти символы, вам необходимо связать эти объектные файлы.

В разделе gcc вы должны указать все объектные файлы, которые должны быть связаны вместе в командной строке, или скомпилировать файлы реализации вместе.

g++ -o test objectFile1.o objectFile2.o -lLibraryName

Здесь libraryName - это просто имя библиотеки, без добавления к платформе. Так, например, в файлах библиотеки Linux обычно называют libfoo.so, но вы должны писать только -lfoo. В Windows этот же файл можно назвать foo.lib, но вы будете использовать тот же аргумент. Возможно, вам придется добавить каталог, в котором эти файлы можно найти, используя -L‹directory›. Обязательно не записывайте пробел после -l или -L.

Для XCode: добавьте пути поиска заголовка пользователя -> добавьте путь поиска библиотеки -> перетащите фактическую ссылку библиотеки в

В MSVS файлы, добавленные в проект, автоматически связывают их объектные файлы, и будет создан файл lib (в общем использовании). Чтобы использовать символы в отдельном проекте, вам нужно будет добавить файлы lib в параметры проекта. Это делается в разделе Linker свойств проекта в Input -> Additional Dependencies. (путь к файлу lib должен быть добавлен в Linker -> General -> Additional Library Directories). При использовании сторонней библиотеки, которая предоставляется с файлом lib, отказ в этом обычно приводит к ошибке.

Также может случиться так, что вы забудете добавить файл в компиляцию, и в этом случае объектный файл не будет сгенерирован. В gcc вы должны добавить файлы в командную строку. В MSVS добавление файла в проект заставит его скомпилировать его автоматически (хотя файлы могут, вручную, быть отдельно исключены из сборки).

В программировании Windows контрольный знак, который вы не связывали необходимая библиотека состоит в том, что имя неразрешенного символа начинается с __imp_. Посмотрите имя функции в документации, и она должна сказать, какую библиотеку вам нужно использовать. Например, MSDN помещает информацию в поле внизу каждой функции в разделе «Библиотека».

14
задан Giuseppe 9 September 2013 в 06:40
поделиться

5 ответов

InnoDB сбрасывает поле auto_increment при перезапуске базы данных.

Когда InnoDB перезагружается, он находит самое высокое значение в столбце, а затем начинает оттуда.

Это не произойдет в MyISAM, потому что он кэширует последний инкрементированный id.

12
ответ дан rAjA 1 September 2018 в 00:53
поделиться

Как указано в answer :

InnoDB сбрасывает поле auto_increment при перезагрузке базы данных.

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

, и это может привести к проблеме внешнего ключа.

К счастью из MySQL 8.0.0 он будет исправлен. Дополнительная информация:

Ошибка # 199 Автоинкрементность Innodb los при перезапуске

WL # 6204: постоянное максимальное значение InnoDB для столбцов автоинкрестности

См. BUG # 199 о ошибках MySQL.

В настоящее время InnoDB выполняет следующие операции при открытии таблицы: SELECT MAX (c) FROM t; где c - имя столбца AUTOINC. Этот шаг используется для инициализации следующего значения автоматического значения столбца, и начиная с этой точки начинается выделение значений автоматического значения. InnoDB также делает это, когда он выполняет «ALTER TABLE AUTO_INCREMENT = N;».

...

InnoDB должен отслеживать максимальное значение и при перезапуске сохранять это максимальное значение и запускать оттуда.

0
ответ дан Lukasz Szozda 1 September 2018 в 00:53
поделиться

Как описано в двигателе InnoDB, последний использованный PK будет использоваться повторно, если строка удаляется до перезагрузки, поскольку она не кэшируется. Если этот PK является внешним ключом (FK) в другой таблице, могут возникнуть проблемы (FK hell). Так я обнаружил проблему, когда маленькая старушка стреляла до 195 см (!), Поскольку дополнительные данные удаляемого человека были подобраны. Для этого нужно либо реализовать «ON DELETE CASCADE» для дочерних таблиц, либо (а не мой предпочтительный вариант) для кодирования этой проблемы.

2
ответ дан OldSteve 1 September 2018 в 00:53
поделиться

Когда у вас есть поле первичного ключа, которое также является auto_increment, независимо от того, сколько строк (или в каком порядке) удалено, идентификаторы, которые больше не существуют, не используются снова, и поле непрерывно увеличивается для каждой строки.

Однако, когда ваш первичный ключ состоит из нескольких полей (EG - поле auto_increment и другое поле), поле auto_increment используется повторно, и только когда удаленный идентификатор является последним id. Это означает, что если у вас есть значения, такие как 1, 2, 3, 4 и 5, и вы удаляете строку с значением поля 5, следующая строка будет иметь идентификатор 5. Однако, если вы удалите строку с id из 2, это снова не будет использоваться, а следующая строка будет иметь идентификатор 6.

8
ответ дан Parham Doustdar 1 September 2018 в 00:53
поделиться

Обычно значения не используются повторно, за исключением случая, о котором вы упомянули.

-1
ответ дан Tzach 1 September 2018 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: