Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток.
Пожалуйста помогите решить задачу, чего то у меня не выходит.
В 2 словах:
SELECT MAX(version) FROM table WHERE value1 = 15 AND value2 = 16;
INT new_version = результат запроса + 1;
И далее INSERT новой строки в эту же таблицу с полученным значением.
INSERT INTO table ( field1, field2, field3) VALUES ( value1, value2, new_version);
Неактивен
INSERT INTO table ( field1, field2, field3) VALUES ( value1, value2, (SELECT MAX(version) FROM table WHERE value1 = 15 AND value2 = 16) + 1 );
Оно?
Неактивен
deadka написал:
INSERT INTO table ( field1, field2, field3) VALUES ( value1, value2, (SELECT MAX(version) FROM table WHERE value1 = 15 AND value2 = 16) + 1 );
Оно?
Не так не прокатывет.
Целевая таблица команды INSERT не должна появляться в утверждении
FROM части SELECT данного запроса, поскольку в ANSI SQL запрещено
производить выборку из той же таблицы, в которую производится вставка.
тут: http://www.mysql.ru/docs/man/INSERT_SELECT.html
А так то тоже что первое в голову пришло :-)
Отредактированно savenkoeugene (25.07.2012 17:54:16)
Неактивен
Да, так MySQL не умеет, к сожалению.
Попробуйте так:
Неактивен
deadka написал:
Да, так MySQL не умеет, к сожалению.
Попробуйте так:SET @tmp = (SELECT MAX(version) FROM table WHERE value1 = 15 AND value2 = 16) + 1;
INSERT INTO table values(field1, field2, @tmp);
Пробовал. Ошибку выдает 1064. Если перевести в 2 словах ошибка синтаксиса. Вероятно сначала надо задекларировать @tmp, но это синтаксис только для хранимых процедур и функций и т.д.
Отредактированно savenkoeugene (25.07.2012 18:13:21)
Неактивен
Проблему решил.
Написал простую хранимую функцию.
Всем спасибо.
Неактивен
Да с каких пор на это хранимые функции требуются?! Это просто два запроса, идущих подряд в одной сессии.
Неактивен
deadka написал:
Да с каких пор на это хранимые функции требуются?! Это просто два запроса, идущих подряд в одной сессии.
У меня не выходило, ошибки которые были описал выше.
Неактивен
mysql> create table t(f1 int, f2 int); Query OK, 0 rows affected (0.13 sec) mysql> insert into t values(1,2),(3,4); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SET @t := (select max(f2) from t); Query OK, 0 rows affected (0.01 sec) mysql> insert into t values(100,@t + 1); Query OK, 1 row affected (0.00 sec) mysql> select * from t; +------+------+ | f1 | f2 | +------+------+ | 1 | 2 | | 3 | 4 | | 100 | 5 | +------+------+ 3 rows in set (0.00 sec)
Неактивен
deadka написал:
Код:
mysql> create table t(f1 int, f2 int); Query OK, 0 rows affected (0.13 sec) mysql> insert into t values(1,2),(3,4); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SET @t := (select max(f2) from t); Query OK, 0 rows affected (0.01 sec) mysql> insert into t values(100,@t + 1); Query OK, 1 row affected (0.00 sec) mysql> select * from t; +------+------+ | f1 | f2 | +------+------+ | 1 | 2 | | 3 | 4 | | 100 | 5 | +------+------+ 3 rows in set (0.00 sec)
Получилось два отдельных запроса, разделенных по времени. Я правильно понимаю, что чисто гипотетически между этими запросами может вклиниться 1 или более от других пользователей и чисто гипотетически переметная @t может уже хранить не верную версию, то есть может появится строки с одинаковой версией, что не допустимо в моей задаче.
Что нибудь типа этого работало бы:
mysql> SET @t := (select max(f2) from t); insert into t values(100,@t + 1);
Но такая конструкция у меня не прокатывала в запросе.
моя версия MySQL: 5.1.63-0+squeeze1
Неактивен