SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.12.2009 13:55:51

zeleniy
Участник
Зарегистрирован: 18.10.2009
Сообщений: 5

Не удаётся установить AUTO_INCREMENT через переменную.

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

Код:

DELIMITER |
CREATE EVENT `clear_battle_table` 
ON SCHEDULE EVERY 1 DAY STARTS '2009-12-18 13:00:00' 
ON COMPLETION PRESERVE ENABLE 
COMMENT 'очистка таблицы боёв' 
DO BEGIN
    DECLARE auto_increment INT DEFAULT 0;
    SELECT AUTO_INCREMENT INTO auto_increment FROM `information_schema`.`TABLES` WHERE TABLE_SCHEMA = "asteria" AND TABLE_NAME = "battle";
    TRUNCATE TABLE `asteria`.`battle`;
    ALTER TABLE `asteria`.`battle` AUTO_INCREMENT = auto_increment;
END
DELIMITER ;

Код:

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 'auto_increment;

Однако, если вместо переменной, подставить число явно, то всё проходит нормально:

Код:

ALTER TABLE `asteria`.`battle` AUTO_INCREMENT = 7;

Так же заметил, что следующий манёвр так же не прокатывает и выдаёт ошибку:

Код:

mysql> SET @ai = 7;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @ai;
+------+
| @ai  |
+------+
|    7 |
+------+
1 row in set (0.00 sec)

mysql> ALTER TABLE `asteria`.`battle` AUTO_INCREMENT = @ai;
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 '@ai' at line 1

Т.е. AUTO_INCREMENT нельзя установить через переменную... а почему ?

P.S. Вообще, суть задачи в том, чтобы удалить из таблицы все строки, при этом сохранив текущее значение автоинкрементного поля. Понятно, что можно сделать просто DELETE FROM `table`, но на сколько я знаю, TRUNCATE работает гораздо шустрее...

Неактивен

 

#2 18.12.2009 17:42:36

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5847

Re: Не удаётся установить AUTO_INCREMENT через переменную.

Прямо в документации про это не написано, но судя по всему AUTO_INCREMENT может принимать только значение равное константе, а не переменной или значение функции.
Но данное ограничение можно обойти используя подготовленные выражения:
http://sqlinfo.ru/forum/viewtopic.php?id=363

Неактивен

 

#3 22.12.2009 00:28:46

kiligin
Завсегдатай
Зарегистрирован: 28.11.2009
Сообщений: 48

Re: Не удаётся установить AUTO_INCREMENT через переменную.

может просто попробовать использовать set???

Неактивен

 

#4 04.11.2011 13:12:17

yura3d
Участник
Зарегистрирован: 04.11.2011
Сообщений: 2

Re: Не удаётся установить AUTO_INCREMENT через переменную.

vasya написал:

Прямо в документации про это не написано, но судя по всему AUTO_INCREMENT может принимать только значение равное константе, а не переменной или значение функции.
Но данное ограничение можно обойти используя подготовленные выражения:
http://sqlinfo.ru/forum/viewtopic.php?id=363

Пожалуйста, Вы не могли бы привести пример? У меня с подготовленными выражениями также запрос не выполняется, если значение передавать через переменную.
Вот пример, как я пробую:

SET @autoinc = (SELECT `AUTO_INCREMENT` FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'test');
PREPARE exp FROM 'ALTER TABLE test.test AUTO_INCREMENT = ?';
EXECUTE exp USING @autoinc;

Выводится ошибка:

#1064 - 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 '?' at line 1

Версия MySQL 5.1.49-3

Неактивен

 

#5 04.11.2011 15:07:41

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5847

Re: Не удаётся установить AUTO_INCREMENT через переменную.

set @a = concat('alter table test auto_increment= ',@autoinc);
PREPARE exp FROM @a;
EXECUTE exp;

Неактивен

 

#6 04.11.2011 15:38:45

yura3d
Участник
Зарегистрирован: 04.11.2011
Сообщений: 2

Re: Не удаётся установить AUTO_INCREMENT через переменную.

vasya написал:

set @a = concat('alter table test auto_increment= ',@autoinc);
PREPARE exp FROM @a;
EXECUTE exp;

Спасибо большое, получилось. Наверное, нубский вопрос, я просто только учусь))

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson