2009-10-05 2 views
0

У меня есть база данных MySQL, содержащая таблицу с первичным ключом auto_increment.В MySQL 5.0 можно ли вставить в таблицу с столбцом auto_increment без обновления значения 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?

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

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

ответ

0

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

+0

Я бы не вставлял значение NULL в столбец id. Я бы просто вставлял в него большое значение. – 2009-10-05 21:50:49

+1

Хм, ну вы можете назначить id в качестве первичного ключа и НЕ auto_increment его, но вам нужно взять на себя ответственность за назначение его каждый раз. – user97410

5

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

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

0

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

2

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

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

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

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

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

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

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

SELECT * FROM `stack-test`; 

Выход:

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

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

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

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

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

1

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

+1

Это должен быть комментарий. – CCoder

0

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

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

Смежные вопросы