Как автоматически обновить значение столбца MYSQL, используя формулу и данные из других столбцов в той же строке? - PullRequest
3 голосов
/ 10 ноября 2011

Вопрос по mySQL.

У меня есть таблица со столбцами, как показано ниже:

BasePrice, Discount, NetPrice

Теперь предположим, что расчет чистой цены происходит следующим образом:

NetPrice = BasePrice - Discount

Теперь я не против ввода значений BasePrice и Discount в столбец самостоятельно, вручную с помощью phpMyadmin (то есть прямого обновления бэкэнда).Поскольку значение NetPrice включает вычисления, как показано выше, я не хочу обновлять значение столбца для каждой строки в таблице, но предпочел бы, чтобы база данных обновляла его автоматически для меня (not that I am weak at math :)).

Есть ли способ, чтобы база данных автоматически обновляла значение столбца NetPrice?Я знаю, что могу использовать php, чтобы получить два других значения столбца, вычислить и затем обновить значение NetPrice, снова используя код php, но я бы предпочел, чтобы db делал это самостоятельно, без каких-либо сценариев на стороне php / server.

Я использую mySQL и phpMyadmin для разработчика.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 10 ноября 2011

Вы можете использовать один запрос для обновления всей таблицы:

UPDATE your_table
SET NetPrice = BasePrice - Discount

или использовать триггер для изменения этого столбца при каждом добавлении строки.
Примерно так:

CREATE TRIGGER onInsert BEFORE INSERT ON `your_table`
FOR EACH ROW
BEGIN
    SET NEW.NetPrice = NEW.BasePrice - NEW.Discount;
END;
4 голосов
/ 15 августа 2013

В качестве альтернативы ответу Марко (+1), для просто INSERT, самый простой подход может быть ссылаться на столбцы, назначенные ранее в утверждении. Например:

INSERT INTO t (BasePrice, Discount, NetPrice) VALUES (17.00, 2.50, BasePrice-Discount);

Для того, чтобы этот столбец NetPrice был рассчитан правильно, столбцы BasePrice и Discount должны присутствовать во вставке перед выражением, которое вычисляет NetPrice. (Значения, присвоенные каждому столбцу, доступны позже в инструкции, после столбцу присвоено значение.)

Если вы всегда хотите гарантировать, что NetPrice будет «синхронизирован», если изменен либо BasePrice, либо Discount, то триггер BEFORE UPDATE сделает это за вас, поэтому комбинация триггера BEFORE INSERT и BEFORE UPDATE было бы уместно. (См. Ответ от Марко.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...