Mysql auto_increment продолжить с наименьшим значением - PullRequest
1 голос
/ 05 июня 2011

Моя проблема: у меня есть таблица со столбцом auto_increment.Когда я вставляю некоторые значения, все в порядке.Вставить первую строку: ID 1 Вставить вторую строку: ID 2

Теперь я хочу вставить строку с идентификатором 10.

Моя проблема в том, что после этого после идентификатора 10 вставляются только строки(что является нормальным поведением).

Но я хочу, чтобы база данных сначала заполняла ID 3-9, прежде чем сделать это.

Есть предложения?

РЕДАКТИРОВАТЬ:

Чтобы уточнить: это сокращение URL, которое я хочу создать для себя.Я преобразую идентификатор в слово (a-zA-z0-9) для поиска, и для сохранения в базе данных я преобразую его в число, которое является идентификатором таблицы.

Проблема теперь:Я сокращаю первую ссылку (без имени) -> ID равен 1, и автоматически имя 1 преобразуется в a-zA-Z0-9, который является

Далее происходит то же самое -> ID равен 2 иимя b, которое преобразовано в 2.

Следующий интересный, кто-то хочет назвать ссылку test -> ID - 4597691, который является преобразованным test

Теперь, если кто-тодобавляет еще одну ссылку без имени -> ID равен 4597692 which будет tesu, потому что число преобразуется.

Я хочу, чтобы новые строки автоматически вставлялись в последний созданный пробел (здесь 3)

Ответы [ 5 ]

0 голосов
/ 05 июня 2011

У вас может быть другой целочисленный столбец для идентификаторов URL.

Ваш процесс может выглядеть так:

  • Если для ссылки создается имя по умолчанию, вы просто вставляете новую строку, заполняете столбец идентификатора URL значением автоинкремента и затем преобразовываете результат в соответствующее имя.

  • Если для URL указано произвольное имя, то после вставки строки столбец идентификатора URL будет заполнен числом, полученным в результате преобразования выбранного имени в целое число.

И так далее. При поиске целочисленных идентификаторов вы должны использовать столбец URL-идентификатора, а не столбец автоинкремента таблицы.

Если я что-то упустил, пожалуйста, дайте мне знать.

0 голосов
/ 05 июня 2011

не уверен на 100%, чего вы пытаетесь достичь, но что-то вроде этого может работать:

drop table if exists foo;
create table foo
(
id int unsigned not null auto_increment primary key,
row_id tinyint unsigned unique not null default 0
)
engine=innodb;

insert into foo (row_id) values (1),(2),(10),(3),(7),(5);

select * from foo order by row_id;

+----+--------+
| id | row_id |
+----+--------+
|  1 |      1 |
|  2 |      2 |
|  4 |      3 |
|  6 |      5 |
|  5 |      7 |
|  3 |     10 |
+----+--------+
6 rows in set (0.00 sec)
0 голосов
/ 05 июня 2011
ALTER TABLE MY_TABLE AUTO_INCREMENT = 3;
0 голосов
/ 05 июня 2011

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

SELECT @id := t1.id +1 
FROM sometable t1 LEFT JOIN sometable t2 
ON t2.id = t1.id +1 WHERE t2.id IS NULL LIMIT 1;

INSERT INTO sometable(id, col1, col2, ... ) VALUES(@id, 'aaa', 'bbb', ... );

Вам нужно будет выполнить оба запроса для каждой вставки, если у вас все еще есть пробелы,решать вам, стоит ли это делать.

0 голосов
/ 05 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...