В MySQL 5.0 можно ли вставлять в таблицу со столбцом auto_increment без обновления значения auto_increment?

0

У меня есть база данных 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?

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

Спасибо заранее.

Теги:
database
auto-increment

7 ответов

5

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

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

2

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

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. Как упоминалось в статистике, поле AUTO_INCREMENT автоматически использует максимальное значение плюс одно. Существует оператор, который сбрасывает счетчик на определенное значение, но это работает только в том случае, если в таблице нет более высокого значения:

ALTER TABLE `stack-test` AUTO_INCREMENT = 2;
1

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

  • 1
    Это должен быть комментарий.
0

Извините за то, что заявили о том, что bleedin 'очевидно, и я вообще не специалист по РСУБД, но не ваше требование так "неортодоксально", что оно диктует другой подход? Вы сами говорите, что знаете, что это "ужасная практика". Разве это не то, что касается полей auto-increment, они служат только одной цели и одной цели: назначить уникальный идентификатор определенной записи и не правда ли, что неправильно неправильно приписывать какое-либо значение независимо от фактического значения?

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

0

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

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

0

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

0

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

  • 0
    Я бы не вставлял значение NULL в столбец id. Я бы просто вставил в него высокое значение.
  • 1
    Хм, ну, вы могли бы назначить идентификатор в качестве первичного ключа, а НЕ auto_increment, но вы должны нести ответственность за его назначение каждый раз.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню