У меня есть таблица a с varhar массивом на id в b таблице.
К примеру (1,2,3,4,5,6). Когда в b таблице я удаляю 5 и 6 елемент(последние) то при добавлении новых элементов в b таблицу новый id создается не 7,8,9... а 5,6,7,8... и получается, что в табилице а 5 и 6 уже не на тот row. Можно конечно и массив в а подчищать, но можно ли сделать чтобы инкремент был уникален?
Вы столкнулись с некоторыми классическими проблемами, которые я по-быстрому опишу (и, возможно, у кого-то будет время расписать подробнее):
Это абсолютно нормально. Стоит подавить внутреннего перфекциониста и оставить зазоры как есть. Ничего страшного в этом не будет, диапазона значений стандартного int хватит с головой на любой проетк, кроме визуального дискомфорта тех немногих, которые будут отслеживать ID в адресной строке, это ничего не принесет.
Такой подход не даст вам нормально пользоваться реляционной БД. Правильным подходом в данном случае будет завести новую таблицу, в которой описывать связи.
Неправильно:
TABLE students
id | first_name | last_name
1 | Vasya | Pupkin
2 | Vitaliy | Merkushev
TABLE teachers
id | first_name | last_name | students
1 | L'enfant | Terrible | '1,2'
Правильно:
TABLE students
id | first_name | last_name
1 | Vasya | Pupkin
2 | Vitaliy | Merkushev
TABLE teachers
id | first_name | last_name
1 | L'enfant | Terrible
TABLE teacher_students # таблица связей, которая описывает, какие именно студенты обучаются
teacher_id | student_id
1 | 1
1 | 2
# Кто учится у конкретного преподавателя?
SELECT students.* FROM teacher_students
INNER JOIN students ON teacher_students.student_id = students.id
WHERE teacher_id = 1
Формально это описывается т.н. нормальными формами БД, про которые вы можете прочитать в википедии
Специально для этого был придуман механизм внешних ключей (foreign key), который позволяет производить базовый набор действий при изменении связанной сущности, например, запрещать удалять преподавателя, пока у него есть студенты, или наоборот, удалять запись о связи в случае удаления студента.
Логика автоинкремента на движке MyISAM следующая
таким образом, Ваша ситуация будет проявляться только при перезапуске сервера. Чтобы обойти этот механизм, добавьте вспомогательную таблицу с одним автоинкрементным столбцом, а в своей таблице автоинкремент уберите. Тогда вставка новой записи будет выглядеть следующим образом
INSERT INTO gen (id) VALUES (NULL);
INSERT INTO mytable (id, .....) VALUES (LAST_INSERT_ID(), ......);
А удалять записи Вы будете только из основной таблицы.
Периодически, вспомогательную таблицу можно подчищать
DELETE FROM gen HAVING id < MAX(id);
Здесь ответ на ваш вопрос: http://stackoverflow.com/questions/3718229/stop-mysql-reusing-auto-increment-ids. В двух словах: в этом случае просто откажитесь от использовать автоинкремента и храните в отдельной таблице последнее значение для ключа, изменяя его при добавлении новых данных.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники