2015-12-14 3 views
1

я стараюсь (пере) установить значение auto_increment к значению переменной, но она не:Использование переменной в настройке MySQL INNODB AUTO_INCREMENT значение таблицы

CREATE TABLE test_table (
    id bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1; 
SET @tmpvar = 12345; 
ALTER TABLE test_table [email protected]; 

Последняя команда не выполняется:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@tmpvar' at line 1 

Невозможно установить значение AUTO_INCREMENT следующим образом? Каковы альтернативы? Мне нужно установить это значение в хранимой процедуре, которая вращает таблицы журналов, и мне нужно, чтобы новая таблица начиналась со значений, взятых из какой-то старой таблицы.

Добавление

Прямое создание таблицы с правильным автоматического приращения intial значения не удается, а также:

CREATE TABLE test_table (
    id bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`)) ENGINE=InnoDB [email protected]; 

P.S. Я нашел соответствующий вопрос здесь и так, но без ответа: Updating auto_increment value in an InnoDB table

EDIT исправлен недостающую точкой с запятой

+0

Используйте [13,5 SQL Синтаксис Подготовленные заявления] (http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html). – wchiquito

+0

Отсутствует; перед командой SET – Shadow

+0

@Shadow - я исправил это. Однако это не проблема. – luksch

ответ

2

Try:

CREATE TABLE `test_table` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1; 

SET @`tmpvar` := 12345; 

SET @`stmt_alter` := CONCAT('ALTER TABLE `test_table` AUTO_INCREMENT = ', @`tmpvar`); 

PREPARE `stmt` FROM @`stmt_alter`; 
EXECUTE `stmt`; 
DEALLOCATE PREPARE `stmt`; 

SQL Fiddle demo

UPDATE

Вы можете использовать 13.5 SQL Syntax for Prepared Statements для 13.1.14 CREATE TABLE Syntax.

SET @`tmpvar` := 12345; 

SET @`stmt_create` := CONCAT('CREATE TABLE `test_table` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=', @`tmpvar`); 

PREPARE `stmt` FROM @`stmt_create`; 
EXECUTE `stmt`; 
DEALLOCATE PREPARE `stmt`; 

SQL Fiddle demo

+0

@Shadow: 'Пользовательские переменные могут использоваться в большинстве контекстов, где разрешены выражения. В настоящее время это не включает контексты, которые явно требуют буквального значения, например, в предложении LIMIT оператора SELECT или в предложении IGNORE N LINES оператора LOAD DATA. '. См. [9.4 Пользовательские переменные] (http://dev.mysql.com/doc/refman/5.7/en/user-variables.html). – wchiquito

+0

Да, понял. Я был слишком сфокусирован на сообщениях об ошибках :( – Shadow

+0

Он работает сейчас, и я понимаю, почему этого не было раньше. Спасибо, что указали мне это. – luksch