PDA

Просмотр полной версии : [Вопрос] MySQL и AUTO INCREMENT



somebodies
03.10.2019, 08:59
Доброго времени суток.
Столкнулся с одной проблемой, ее суть в следующем.
Допустим, есть таблица следующего вида:
поле "A", тип данных - varchar
поле "B", тип данных - int
поле "С", тип данных - int со ключом AUTO_INCREMENT

Далее, вставляем несколько записей, получится что-то вроде этого:



пример
228
1


еще один
69
2


ну и еще
1337
3



Удаляем из базы данных запись, где авто инкремент равен 2.
Получается, остается две записи с идентификаторами 1 и 3.
Далее, при добавлении записи в БД, колонка с авто инкрементом будет содержать цифру 4.
Собственно, в чем проблема. Я знаю, что значение авто инкремента можно поменять в самой СУБД (пример тому phpMyAdmin), но есть ли какой-то специальный запрос в mySQL, который сам выставляет значения согласно количеству записей и устанавливает наивысший (согласно количеству записей) авто-инкремент автоматически, без ручной работы? Чтобы было нагляднее (так как объяснять я не умею):
До:


пример
228
1


еще один
69
2


ну и еще
1337
5


так и быть, еще
1337
8



После:


пример
228
1


еще один
69
2


ну и еще
1337
3


ладно, еще один
1337
4



При добавлении следующая запись будет содержать значение авто-инкремента "5"

Pa4enka
03.10.2019, 11:40
format(dbHandle, query, sizeof query, "DELETE FROM houses WHERE id = '%d'", HouseInfo[houseid][hID]);
mysql_tquery(dbHandle, query);

format(dbHandle, query, sizeof query, "ALTER TABLE houses AUTO_INCREMENT = %d", HouseInfo[houseid][hID]);
mysql_tquery(dbHandle, query);
Это?

DeimoS
03.10.2019, 11:50
То, что ты хочешь, легче всего сделать через пересоздание таблицы. Либо делать вот такой трудоёмкий (http://pro-pawn.ru/showthread.php?14722-%D0%9F%D0%BE%D0%B8%D1%81%D0%BA-%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%B3%D0%BE-%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B4%D0%BB%D1%8F-%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D0%B0-GetFreeTableNumber) запрос, определяя свободный ID перед созданием нового столбца и указывать значение для столбца "C" вручную.

Ни первый, ни второй вариант тебе не нужен. Всё, что тебе нужно - создать ещё один столбец и определять порядок значений в нём вручную (либо через foreach и Iter_Add/Iter_Remove/Iter_Free как тут (http://pro-pawn.ru/showthread.php?16924-%D0%9A%D0%B0%D0%BA-%D0%BB%D1%83%D1%87%D1%88%D0%B5-%D0%B2%D1%81%D0%B5%D0%B3%D0%BE-%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D1%83-%D0%B4%D0%BE%D0%BC%D0%BE%D0%B2&p=95184&viewfull=1#post95184)). Столбец AUTO_INCREMENT вообще трогать не стоит, чтоб самому себе не создать проблем. А проблемы могут быть, если, например, изменить AUTO_INCREMENT на 5, а столбец с таким ID уже существует. Соответственно, следующий INSERT-запрос просто не сработает, ибо этот запрос будет с дублирующим AUTO_INCREMENT-значением.