В MySQL 5.0 можно ли вставить таблицу с столбцом auto_increment без обновления значения auto_increment? - PullRequest
0 голосов
/ 06 октября 2009

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

Считайте следующее определение достаточным для этого примера:

create table test(id integer not null auto_increment primary key) engine=innodb;

Теперь обычно я вставляю в эту таблицу следующий синтаксис:

insert into test() values();

Это соответствующим образом обновит значение auto_increment, и это нормально.

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

Можно ли вставить высокие значения в эту таблицу таким образом, чтобы не влиять на значение идентификатора auto_increment?

Я знаю, что это ужасная практика, но она значительно упростит некоторые вещи, которые я должен сделать.

Заранее спасибо.

Ответы [ 7 ]

5 голосов
/ 06 октября 2009

MySQL 5.0 позволяет вам вставить произвольное значение в поле автоинкремента, но это изменит следующее значение, используемое для автоинкремента. И хотя вы можете изменить «следующее число», которое будет использовать поле автоинкремента (с ALTER TABLE t AUTO_INCREMENT = number), оно должно быть больше максимального значения, которое в данный момент находится в этом столбце.

Так что нет, не похоже, что вы можете достичь того, о чем просили.

2 голосов
/ 06 октября 2009

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

CREATE TABLE IF NOT EXISTS `stack-test` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(255),
  PRIMARY KEY  (`id`)
);

Следующий запрос вставит строку с автоматически сгенерированным идентификатором:

INSERT INTO `stack-test` (name) VALUES ('Peter');

И этот запрос вставит строку с пользовательским идентификатором:

INSERT INTO `stack-test` (id, name) VALUES (5, 'Joe');

Проверьте, запросив все строки:

SELECT * FROM `stack-test`;

Выход:

+----+-------+
| id | name  |
+----+-------+
|  1 | peter |
|  5 | Joe   |
+----+-------+

Обновление: просто прочитайте, что вы не хотите влиять на значение AUTO_INCREMENT. Как уже упоминалось в staticsan, поле AUTO_INCREMENT автоматически использует самое высокое значение плюс единицу. Есть оператор, который сбрасывает счетчик на определенное значение, но это работает, только если в таблице нет более высокого значения:

ALTER TABLE `stack-test` AUTO_INCREMENT = 2;
1 голос
/ 12 ноября 2012

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

0 голосов
/ 24 июля 2014

извините за констатацию очевидности, и я вообще не специалист по RDBMS, но разве ваше требование не настолько "неортодоксально", что оно диктует другой подход? Вы сами говорите, что знаете, что это «ужасная практика». Разве в полях автоинкремента нет того, что они служат одной цели и только одной цели: назначить уникальный идентификатор конкретной записи, и не является ли абсолютно неправильным приписывать какое-либо значение фактическому значению?

Итак, неважно, могу ли я предложить использовать другое поле, чтобы делать то, что вы хотите?

0 голосов
/ 27 августа 2012

Как насчет резервирования некоторых начальных значений вместо конечных? Я имею в виду, сохранить идентификаторы, скажем, менее 1000, как зарезервировано. Сделайте автоматическое начальное увеличение как 1001, чтобы новые вставки имели значение после этого, и используйте IDENTITY INSERT для добавления значений в зарезервированный диапазон.

Надеюсь, это поможет.

0 голосов
/ 06 октября 2009

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

0 голосов
/ 06 октября 2009

Я не верю, что автоматически увеличиваемые поля должны быть первичными ключами и, как таковые, не равны нулю.

...