У меня есть таблица, которая содержит автоматически увеличенный идентификатор первичного ключа. Если я удаляю последнюю строку (самый высокий идентификатор, например, для экспертизы = 6) и вставляю новую строку, новый идентификатор начинается с 7. Какой параметр мне нужно изменить, чтобы первичный ключ начинался с 6?
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');
Результат:
имя
1 собака
2 кошка
3 пингвин
4 слабый
5 кит
6 страус
DELETE FROM animals WHERE id = 6;
INSERT INTO animals (name) VALUES
('x');
Результат:
имя
1 собака
2 кошка
3 пингвин
4 слабый
5 кит
7 х
Спасибо за совет.
mysql
primary-key
mariadb
auto-increment
Джордано
источник
источник
Ответы:
Это по замыслу - все СУБД действуют так, как это было с автоинкрементными столбцами.
В противном случае внешняя ссылочная целостность может быть повреждена. Для простого примера представьте, что вы храните URL-адреса сокращающей службы, используя в качестве ключа столбец с автоинкрементом. Вы не знаете, был ли кому-либо выдан сокращенный URL, а база данных, конечно же, нет, поэтому повторное использование идентификатора 1234 может привести к тому, что чья-то бедная бабушка посетит somenastypornsite.xxx вместо loverlyknitting.org, когда она щелкает http: / /shortthi.ng/1234 в старом письме, вместо того, чтобы получить сообщение «извините, но эта ссылка больше не существует в наших записях».
Также, если вы сбросите приращение после удаления последнего элемента, будете ли вы проходить всю работу (или ожидаете, что база данных) перенумерует все после 5-го элемента из 5 миллионов, когда 5-й элемент будет удален? дополнить изменения в других таблицах, где ограничения внешнего ключа указывают на столбец приращения? Такая дополнительная работа может стоить очень дорого с точки зрения ввода-вывода.
Если вы делаете сброс приращения точки после удаления последнего элемента, не очень очень осторожны ваших уровней изоляции транзакций: Вы можете сбросить его , так же , как другую транзакцию используют значения, что приводят к ошибкам (или хуже, немой неудаче), если Вы убедитесь, что ваши действия полностью изолированы.
Как правило, я рекомендую людям, работающим с базами данных, прочитать «Антипаттерны SQL», в которых есть глава по этому вопросу, озаглавленная «Аккуратные уловки с псевдо-ключами» (которая охватывает этот вопрос более дружественным образом, чем заголовок главы может показывать некоторым!). По сути, если значение имеет значение помимо того, что оно является ключом (или, самое большее, содержит информацию о порядке вставки), то, вероятно, оно не должно быть столбцом с автоинкрементным увеличением, и если оно не имеет значения, кроме того, что оно является ключом (или, в большинстве случаев, имеет порядок вставки). информация) тогда пробелы не должны иметь значения.
источник
Вы можете сбросить значение auto_increment, используя следующее:
Вам нужно будет определить максимальное значение, присутствующее в таблице, и добавить 1 к этому значению для использования в приведенном выше заявлении.
источник