Расширенное использование автоинкремента? - PullRequest
1 голос
/ 11 ноября 2011

Я постараюсь сделать этот вопрос как можно более кратким.Мне было интересно, если есть способ сделать следующее с помощью PHP и MySQL кодирования:

  1. Удалить автоматически увеличиваемую запись идентификатора (скажем, запись 12 из 20), и в то же времяуменьшите остальные записи на 1. (Пример: Удалить запись 12 == Запись 13 становится 12, 14 становится 13, и т. д. и т. д.)

  2. Вставить вручную (т.е. через форму)запись с идентификатором, так что остальные подталкиваются, если это указано пользователем (и по умолчанию нормальное поведение, если ничего не указано. (Пример: пользователь указывает, что он хочет, чтобы его запись была идентификатором 14, но уже существует идентификатор 14).в базе данных. Что должно произойти, это то, что пользовательский ввод выдвигает уже существующую запись до 15, а остальные существующие записи следуют аналогичному способу. Если пользователь не указывает идентификатор, по умолчанию используется обычное поведение.)

Я все еще изучаю MySQL и PHP, и мне нужен код для системы галереи изображений, которую я уже некоторое время создаю.

Это навсе возможно?

Ответы [ 4 ]

4 голосов
/ 11 ноября 2011

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

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

1 голос
/ 11 ноября 2011

Для задачи 1 вам нужно будет вручную установить значение AUTO_INCREMENT для этой таблицы после изменения всех идентификаторов, чтобы не было пробела при следующей вставке.Гораздо лучший способ - вообще не использовать идентификатор с автоматическим приращением - иметь столбец идентификаторов и использовать MAX (id) +1, чтобы найти требуемый идентификатор во время вставки записи.

вот мой псевдокод:

для удаления:

$n = 12;
DELETE from items where id='$n';
UPDATE items SET id=id-1 WHERE id > '$n'

для указанной вставки:

$n = 15;
(if there is a record with id = 15)
   UPDATE items SET id=id+1 WHERE id >= '$n'
INSERT into items (id,..) values ('$n',...)

для неуказанной вставки

$n = SELECT MAX(id)+1 FROM items
INSERT into items (id,..) values ('$n',...)
0 голосов
/ 11 ноября 2011

Вы можете использовать это для вашего 1) вопроса.Запустите весь блок вместе.@id должен быть установлен на строку, которую вы хотите удалить.

SET @id = 12;
DELETE FROM tbl WHERE id = @id;
UPDATE  tbl set id = id-1 WHERE id > @id;
ALTER TABLE tbl AUTO_INCREMENT = 0;

Отказ от ответственности MySQL: вы не можете сбросить счетчик до значения, которое меньше или равно значению, которое уже использовалось.Для MyISAM, если значение меньше или равно максимальному значению, которое в настоящее время находится в столбце AUTO_INCREMENT, значение сбрасывается до текущего максимального плюс один.Для InnoDB вы можете использовать ALTER TABLE ... AUTO_INCREMENT = значение с MySQL 5.0.3, но если значение меньше текущего максимального значения в столбце, ошибка не возникает и текущее значение последовательности не изменяется.

0 голосов
/ 11 ноября 2011

Для # 1 попробуйте следующие команды SQL:

DELETE FROM table WHERE id=12;
UPDATE table set id=id-1 WHERE id > 12;
ALTER TABLE table AUTO_INCREMENT=AUTO_INCREMENT-1;

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

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