Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > интересное увеличение числа одним SQL запросом


Автор: Cheizer 20.9.2011, 10:38
Подскажите пожалуйста, как грамотно SQL запрос написать, что бы увеличить на 7% все цены на сайте, есть поле "price" в базе, делаю так:

Код

UPDATE product SET `price` = round(price * 1.15)
UPDATE product SET `price` = price * 1.1 


пока безрезультатно :(, цены только уменьшаются....

Автор: Akina 20.9.2011, 10:45
Ну нельзя апдейтить таблицу выбираемыми из неё значениями! сделай вьюшку, которая выберет ID и PRICE, и апдейти по ней...

Код

create view id_price
as
select id, price
from product;

update product, id_price
set product.price=round(1.07*id_price.price, 2)
where product.id=id_price.id;

Автор: Cheizer 20.9.2011, 10:48
Цитата(Akina @ 20.9.2011,  10:45)
Ну нельзя апдейтить таблицу выбираемыми из неё значениями! сделай вьюшку, которая выберет ID и PRICE, и апдейти по ней...

Код

create view id_price
as
select id, price
from product;

update product, id_price
set product.price=round(1.07*id_price.price, 2)
where product.id=id_price.id;

а что такое вьюшка? smile И почему нельзя апдейдить так напрямую?

Добавлено через 5 минут и 23 секунды
я так сделал, UPDATE product SET `price` = round(price * 1.07)

почему нельзя таким методом напрямую? Цены вроде поднялись на 7% smile

Автор: AndreyIQ 20.9.2011, 10:58
Цитата(Cheizer @ 20.9.2011,  10:48)
я так сделал, UPDATE product SET `price` = round(price * 1.07)

почему нельзя таким методом напрямую? Цены вроде поднялись на 7% smile

Можно, все так и делают

Автор: Zloxa 20.9.2011, 11:00
Цитата(Akina @  20.9.2011,  10:45 Найти цитируемый пост)
Ну нельзя апдейтить таблицу выбираемыми из неё значениями! сделай вьюшку, которая выберет ID и PRICE, и апдейти по ней...

НЕУЖЕЛИ В МАСЕ ВСЕ ДЕЙСТВИТЕЛЬНО ТАК ПЛОХО?  smile 

Автор: Cheizer 20.9.2011, 11:22
Всем спасибо, Akina спасибо за интересный вариант smile.

Автор: Akina 20.9.2011, 12:55
Цитата(AndreyIQ @  20.9.2011,  11:58 Найти цитируемый пост)
Можно, все так и делают 

Цитата(Zloxa @  20.9.2011,  12:00 Найти цитируемый пост)
НЕУЖЕЛИ В МАСЕ ВСЕ ДЕЙСТВИТЕЛЬНО ТАК ПЛОХО?

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

Автор: Zloxa 20.9.2011, 13:10
Цитата(Akina @  20.9.2011,  12:55 Найти цитируемый пост)
Метод прямого обновления содержит в себе потенцию неоднозначности и зацикливания.

Если только тут не некая вычурная особенность маси.... Мне кажется ты путаешься и путаешь других. Неоднозначность появляется при чтении из row триггера, в момент записи. Рекурсивное зацикливаниие же - при записи в таблицу из триггера на нее. В предложении же set апдейта столько же неоднозначности и рекурсии, сколько и в обычном присваивании. То бишь - ноль. И, в общем то, не зачем тут городить всякие не нужные селфджойны и подзапросы.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)