MySQL - автоматическое уменьшение значения - PullRequest
4 голосов
/ 28 июня 2010

Допустим, у меня есть такая таблица (id - автоинкремент):

id | col1 | col2
1  | 'msg'| 'msg'
2  | 'lol'| 'lol2'
3  | 'xxx'| 'x'

Теперь я хочу удалить строку № 2 и получаю что-то подобное

id | col1 | col2
1  | 'msg'| 'msg'
3  | 'xxx'| 'x'

Дело в том, что я хочу получить:

id | col1 | col2
1  | 'msg'| 'msg'
2  | 'xxx'| 'x'

Как я могу сделать это ПРОСТОЕ (мои знания о MySQL очень плохие)?

Ответы [ 5 ]

9 голосов
/ 28 июня 2010

Ты не должен этого делать.
Не принимайте автоматически увеличивающийся уникальный идентификатор в качестве порядкового номера.
Слово «уникальный» означает, что идентификатор должен быть прикреплен к его строке навсегда .

Нет связи между этими числами и перечислением.
Представьте, что вы хотите выбрать записи в алфавитном порядке. Куда делись ваши драгоценные числа? База данных не похожа на упорядоченный список, как вы, вероятно, думаете. Это не плоский файл со строками, хранящимися в предопределенном порядке. У него совершенно другая идеология. Строки в базе данных не имеют никакого порядка. И будет упорядочен только в выбранное время, если это было явно установлено в предложении ORDER BY.
Кроме того, база данных должна выполнять поиск для вас. Таким образом, вы можете сказать, что с отфильтрованными строками или другим порядком это число с автоприращением не будет иметь абсолютно никакого отношения к позициям реальных строк.

Если вы хотите перечислить вывод - это работа уровня презентации. Просто добавьте счетчик на стороне PHP.

И снова: эти цифры должны идентифицировать определенную запись. Если вы измените этот номер, вы больше никогда не найдете свою запись.

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

stackoverflow.com / questions / 3132439 / mysql-auto-decmenting-value

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

Помните: перенумерация уникальных идентификаторов - это зло!

0 голосов
/ 28 июня 2010

Не рекомендуется менять значение столбца auto_increment.Однако, если вы уверены, что хотите, следующее должно помочь:

Если вы удаляете только одну запись за раз, вы можете использовать транзакцию:

START TRANSACTION;
DELETE FROM table1 WHERE id = 2;
UPDATE table1 SET id = id - 1 WHERE id > 2;
COMMIT;

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

ALTER TABLE table1 DROP id;
ALTER TABLE table1 ADD id INTEGER NOT NULL AUTO_INCREMENT;

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

0 голосов
/ 28 июня 2010

Вы можете изменить нумерацию всей таблицы следующим образом:

SET @r := 0;
UPDATE  mytable
SET     id = (@r := @r + 1)
ORDER BY
        id;
0 голосов
/ 28 июня 2010

Зачем использовать автоинкремент, если вы хотите изменить его вручную?

0 голосов
/ 28 июня 2010

Я думаю, что нет прямого пути к этому. Может быть, вы можете сделать "update" операцию. Но вы должны сделать это для всей записи после вашей удаленной записи. Это очень плохое решение для этого.

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