SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 25.07.2012 17:49:36

savenkoeugene
Участник
Зарегистрирован: 25.07.2012
Сообщений: 6

Помогите составить INSERT

Доброго времени суток.

Пожалуйста помогите решить задачу, чего то у меня не выходит.

В 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);

Неактивен

 

#2 25.07.2012 17:51:39

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите составить INSERT

INSERT INTO table ( field1, field2, field3) VALUES ( value1, value2, (SELECT MAX(version) FROM table WHERE value1 = 15 AND value2 = 16) + 1 );

Оно?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 25.07.2012 17:53:27

savenkoeugene
Участник
Зарегистрирован: 25.07.2012
Сообщений: 6

Re: Помогите составить INSERT

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)

Неактивен

 

#4 25.07.2012 18:00:31

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите составить INSERT

Да, так MySQL не умеет, к сожалению.
Попробуйте так:

SET @tmp = (SELECT MAX(version) FROM table WHERE value1 = 15 AND value2 = 16) + 1;
INSERT INTO table values(field1, field2, @tmp);


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 25.07.2012 18:05:11

savenkoeugene
Участник
Зарегистрирован: 25.07.2012
Сообщений: 6

Re: Помогите составить INSERT

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)

Неактивен

 

#6 26.07.2012 12:17:43

savenkoeugene
Участник
Зарегистрирован: 25.07.2012
Сообщений: 6

Re: Помогите составить INSERT

Проблему решил.

Написал простую хранимую функцию.

Всем спасибо.

Неактивен

 

#7 26.07.2012 12:19:23

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите составить INSERT

Да с каких пор на это хранимые функции требуются?! Это просто два запроса, идущих подряд в одной сессии.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 26.07.2012 13:03:21

savenkoeugene
Участник
Зарегистрирован: 25.07.2012
Сообщений: 6

Re: Помогите составить INSERT

deadka написал:

Да с каких пор на это хранимые функции требуются?! Это просто два запроса, идущих подряд в одной сессии.

У меня не выходило, ошибки которые были описал выше.

Неактивен

 

#9 26.07.2012 13:05:31

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите составить INSERT

Код:

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)

Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#10 26.07.2012 16:09:06

savenkoeugene
Участник
Зарегистрирован: 25.07.2012
Сообщений: 6

Re: Помогите составить INSERT

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

Неактивен

 

Board footer

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