Как создать триггер обновления после вставки новой записи?

Я создал таблицу в mysql. Имя таблицы sales, которая содержит следующие столбцы saleID int NOT NULL Primary Key, productID int NOT NULL, unitPrice decimal(6,2) NOT NULL, quantity int NOT NULL, total decimal(6,2) Теперь я хочу update trigger после вставки новой записи, которая находит общую цену этой продажи.

Я пытаюсь написать триггер обновления

DELIMITER $$
CREATE TRIGGER before_sales_insert  
before INSERT ON sales
FOR EACH ROW 
 BEGIN

END#
$$
DELIMITER 

Я новичок, пожалуйста, помогите. Спасибо

В триггере перед вставкой вы можете изменить NEW. значения. Но из вашего кода или вопроса мне не ясно, получили ли вы цену за единицу до срабатывания триггера. Пожалуйста, просмотрите dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html

P.Salmon 07.04.2019 13:20

@P.Salmon Спасибо за ответ, но я новичок, я понятия не имею о NEW. Общая цена за единицу для этой продажи.

don 07.04.2019 13:22

Без обид, но именно поэтому вы должны прочитать руководство с большим количеством примеров. И вы не ответили на мой вопрос о получении цены за единицу до срабатывания триггера.

P.Salmon 07.04.2019 13:27

Вам не нужно хранить итоги в таблице SQL, так как это в основном противоречит «правилам» нормализации. В идеале вы должны вычислять итоги на лету с запросом или в представлении.

Raymond Nijland 07.04.2019 13:42

@Raymond Nijland Не уверен, что согласен, что это проще сделать, чем просматривать таблицы истории, чтобы найти цену, применимую на момент продажи (при условии, что цена продукта может измениться).

P.Salmon 07.04.2019 13:44

true @P.Salmon История цен на товары — это совсем другое, чем расчет общей суммы продаж.

Raymond Nijland 07.04.2019 13:50
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
6
334
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Дано

select productid ,standardcost from awproduct where productid = 707;
+-----------+--------------+
| productid | standardcost |
+-----------+--------------+
|       707 |         3.00 |
+-----------+--------------+

и предполагая, что вы не получили цену за единицу до срабатывания триггера

drop table if exists t;
drop trigger if exists t;
create table t
(id int, productid int, unitprice int, quantity int, totalprice int);

delimiter $$
create trigger  t
before insert on  t
for each row begin
    set new.unitprice = (select standardcost from awproduct where productid = new.productid);
    set new.totalprice = new.quantity * new.unitprice;

end $$
delimiter ;

insert into t (id,productid,quantity) values
(1,707,10);

select * from t;

+------+-----------+-----------+----------+------------+
| id   | productid | unitprice | quantity | totalprice |
+------+-----------+-----------+----------+------------+
|    1 |       707 |         3 |       10 |         30 |
+------+-----------+-----------+----------+------------+
1 row in set (0.00 sec)

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

после применения этого триггера я пытаюсь вставить в таблицу, но эта ошибка 18:01:19 INSERT INTO sales (saleID,productID,unitPrice,quantity) VALUES (2,23,32.33,2) Error Code: 1048. Column 'unitPrice' cannot be null 0.000 sec до того, как триггеры работают нормально, вставка прошла успешно

don 07.04.2019 15:02

Другие вопросы по теме