Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: select for update

пишу процедуру и туплю.

надо выбрать записи через блокировку select for update в курсор и обработать,
потом например перелить спустя время обработки этот же набор в другую таблицу
снова выбрав по тем же параметрам.

вопрос: будет ли повторяемое чтение? или что нужно сделать что бы было повторяемое чтение?

можно конечно по одной записи из курсора. но зачем.
Ответ:
sevasel
изначально select for update был использован чтобы предотвратить работу пользователей дальше с теми записями, которые ушли на обработку.

Может стоит и не блокировать, а сразу выставлять статус типа "в обработке" с коммитом?
А то получается юзер видит записи и недоумевает, почему не может их редактировать или ломается по селект фор апдейт ноувэйт, или вообще просто виснет? )
Вопрос: Select from update, туплю-торможу, помогите, пожалуйста

Добрый вечер.
Есть запрос вида
with t as (select id, zz from table_1 where [conditions])
select id, t2.things from table_2 t2 join t using (id)
where zz = 1
and t2.things is null

При его помощи надо проапдейтить таблицу table_2, поле things по полученным записям.
Знаю, что есть некий select from update, но доселе пользоваться им не приходилось.
Если возможно, напишите пример для представленного мной случая, если нет, то дайте ссылочку на описание, пожалуйста.
Гугл предоставил мне пару ссылок на документацию, но моих мозгов не хватило, чтобы как следует разобраться и написать, везде ошибка синтаксиса.
Заранее спасибо.
Ответ:
Ой не факт..
Проверьте кто-нть на 12с, вдруг пофиксили...
Дай single script.
Вопрос: Select внутри update

Доброго дня прошу помощи у знающих людей.
Вопрос такой : Есть 2 таблицы. Нужно обновить строки первой таблицы, но только те, ID которой = ID второй таблицы..
Проще говоря обновляем строки у которых ID равные в обеих таблицах. я сделал так:
имеем 2 таблицы:tab1 и tab2 поля обеих таблиц одинаковые,в обеих есть id и name .
UPDATE tab1 SET name = 1 WHERE tab1.id = (SELECT tab2.id from tab2)
Обновить нужно строки tab1 , id которых = id строк из tab2.
в том варианте все получается,но только если в tab2 только одна запись...и это естественно,потому что если строк больше в запросе SELECT у нас выходят все id 2 таблицы.Помогите пожалуйста,не могу додуматься как сделать.
Ответ:
ssm116
Akina,выходит так?
UPDATE tab1,tab2
SET name=1
WHERE tab2.id=tab1.id

UPDATE tab1,tab2
SET tab1.name=1
WHERE tab2.id=tab1.id
Вопрос: SELECT ... FOR UPDATE & JOIN

Нужно обновить счетчик у сообещения (message).
В запросе к сообщению джойним запись пользователя, чтобы узнать имя (для дальнейшей логики).
Делаем блокировку записи на чтение, чтобы избежать коллизий:

SELECT
messages.*,
users.name
FROM messages
LEFT JOIN
users ON users.id =messages.user
WHERE messages.id="1123"
FOR UPDATE

Вопрос вот в чем: заблокирована будет только запись message (id="1123") или еще и user в джойне?
Ответ: По логике, неплох был бы JOIN FOR UPDATE )
Все вопросы бы решил
Вопрос: Переделать select в update

Есть выборка документов по select нужно переделать в ubdate, что бы одно из полей заполнилось значением
Помогите пожалуйста: как колонку pars_povtor нужно проставить 8 цифру этим документам
Колонка pars_povtor находится в таблице link

SELECT
                `dd`.`id` AS `doc_id`, 
	l.*
FROM   `link` `l`
            LEFT JOIN `doc_data` `dd` ON dd.link_id = l.id AND dd.reestr_id = l.reestr_id
            LEFT JOIN `doc_ops_status` `dos` ON dos.id = dd.id
            WHERE
                l.reestr_id = 7
                AND (l.doc_html_file <> '' AND l.doc_html_file IS NOT NULL)
	AND dd.id IS NOT NULL
                AND dos.doc_updated <= l.parsed_date


картинка тут
Ответ:
Ольга Семенова
TaPaK, так вроде язык SQL в команде UPDATE одинаковый в плане синтаксиса

еще как разный, когда вы апдэйтите данныe в одной таблице
на основании данных из другой.
и джойновый синтаксис у вас не прокатит.
примерчик
Вопрос: Переделать select в update

Есть выборка документов по select нужно переделать в update, что бы одно из полей заполнилось значением

SELECT
                `dd`.`id` AS `doc_id`, 
	l.*
FROM   `link` `l`
            LEFT JOIN `doc_data` `dd` ON dd.link_id = l.id AND dd.reestr_id = l.reestr_id
            LEFT JOIN `doc_ops_status` `dos` ON dos.id = dd.id
            WHERE
                l.reestr_id = 7
                AND (l.doc_html_file <> '' AND l.doc_html_file IS NOT NULL)
	AND dd.id IS NOT NULL
                AND dos.doc_updated <= l.parsed_date


картинка тут
Ответ: Спасибо большое
Вопрос: Изменить SELECT на UPDATE

Здравствуйте!

Есть запрос:
SELECT floor((if (SUM(tb_ready.sended)>0, SUM(tb_ready.readed)*100/SUM(tb_ready.sended),0) + if (SUM(tb_ready.readed)>0, SUM(if (tb_ready.linkcount>0,1,0))*100/SUM(tb_ready.readed),0))/40) FROM tb_ready, tb_clients WHERE tb_ready.client = tb_clients.client GROUP BY tb_clients.client


Он выдает по каждому клиенту (tb_clients.client) определенный балл.

Есть 2 таблицы: tb_clients, tb_ready с общим полем client

Как можно переписать это код, чтобы вместо выборки эти баллы приписывались клиенту?
UPDATE tb_clients SET tb_clients.client = ....
Ответ: Спасибо огромное!
А как раз до такого и додумался
Вопрос: Как определить сессию из которой запущен select for update

Добрый день.

Ситуация следующая:

Таблица удерживается оператором select for update skip locked, коммита нет. Как определить, из какой сессии запущен этот селект?
(нужно убить секцию, чтобы можно было накатить на это таблицу DDL)

Заранее спасибо
Ответ:
Tyo
а как понять какой именно лок из V$LOCK относится к интересующему меня
TFSCLOCK.SQL
Вопрос: SELECT в UPDATE (Запрос в запросе). Умножение полей таблиц между собой

Привет уважаемые посетители этого форума!
Не раз он меня выручал в сложных ситуациях)
Надеюсь, что и в этот раз выручит)
Есть запрос:
К примеру нужно выбрать два поля таблицы (одно с одной, другое с другой) и нужно перемножить значения этих полей между собой и вернуть в нужное поле ТОЛЬКО с помощью UPDATE.
Вот как это я пытаюсь сделать:
SQL
1
2
3
4
5
"UPDATE grocery_supermarket_manager.stock AS stock, " + 
                "(SELECT price_for_one FROM grocery_supermarket_manager.products WHERE id_products = 1) AS products, " +
                "(SELECT quantity FROM grocery_supermarket_manager.stock WHERE id_stock = 1) AS st, " +
                           " SET stock.price = products.price_for_one * st.quantity" +
                          " WHERE stock.id_stock = 1"
Выдаёт следующую ошибку:
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 'SET stock.price = products.price_for_one * st.quantity WHERE stock.id_stock = 1' at line 1

Что мне посоветуете (только адекватные решения для этого вопроса)?
Что использую MySQL, C#, .NET, SQLconnector for NET.
В программе нету ошибок только в запросе.
Ответ: К примеру нашёл вот это:

UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col

---------------------------------------------

UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);

Как второй попытаться написать?

Добавлено через 2 минуты
Error Code: 1093. You can't specify target table 'tbl' for update in FROM clause

Добавлено через 2 минуты
или 1 вариант

Добавлено через 2 часа 51 минуту
Решено!
Но ещё усовершенствовать буду)))
SQL
1
2
3
4
5
6
UPDATE grocery_supermarket_manager.stock AS T1,
      (SELECT price_for_one
        FROM grocery_supermarket_manager.products
        WHERE id_products = 1) AS T2 
  SET T1.price = T2.price_for_one + T1.quantity
WHERE T1.id_stock = 1;
Добавлено через 16 минут
Итак, что делает этот запрос?!
Выбираем таблицу в которой необходимо посчитать нужное нам поле.
Потом выбираем конкретную строку поля с одной таблицу
А затем выбираем конкретную строку поля с другой таблицы
В SET пишем нужное нам поле (ячейку) столбца для которой нужно посчитать значение
MySQL
1
2
3
4
5
6
7
8
9
UPDATE grocery_supermarket_manager.stock AS T1,
      (SELECT price_for_one
        FROM grocery_supermarket_manager.products
        WHERE id_products = 1) AS T2,
      (SELECT quantity
        FROM grocery_supermarket_manager.stock
        WHERE id_stock = 1) AS T3
  SET T1.price = T2.price_for_one * T3.quantity
WHERE T1.id_stock = 1;
Надеюсь кому-то пригодиться)
Вопрос: WHERE SELECT() внутри UPDATE

Пытаюсь сделать следующее:
Код

UPDATE `stat` SET `result` = 300  WHERE `id` = (SELECT MAX(`id`) FROM `stat` WHERE `uid` = 5 AND `column1` = 'param1' AND `column2` = 10 AND `result_no` = 3 )  ;


Говорит you can't specify target table 'stat' for update in FROM clause.

Элементарно не работает:
Код

UPDATE `stat` SET `result` = 20 WHERE `id` = (SELECT MAX(`id`) FROM `stat`);


или 

Код

UPDATE `stat` SET `result` = 20 WHERE `id` = MAX(`id`) ;


id - primary auto inc.
Нужно именно по MAX(id) обновить.

MySQL 5.0.41 . 

Это сообщение отредактировал(а) Zamuta - 6.10.2007, 10:57
Ответ:
Есть  обойти ошибку, переделать внутренний селект как SELECT FROM SELECT

Это сообщение отредактировал(а) nistelroi - 24.7.2014, 00:37