Я создал таблицу в 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
Я новичок, пожалуйста, помогите. Спасибо
@P.Salmon Спасибо за ответ, но я новичок, я понятия не имею о NEW
. Общая цена за единицу для этой продажи.
Без обид, но именно поэтому вы должны прочитать руководство с большим количеством примеров. И вы не ответили на мой вопрос о получении цены за единицу до срабатывания триггера.
Вам не нужно хранить итоги в таблице SQL, так как это в основном противоречит «правилам» нормализации. В идеале вы должны вычислять итоги на лету с запросом или в представлении.
@Raymond Nijland Не уверен, что согласен, что это проще сделать, чем просматривать таблицы истории, чтобы найти цену, применимую на момент продажи (при условии, что цена продукта может измениться).
true @P.Salmon История цен на товары — это совсем другое, чем расчет общей суммы продаж.
Дано
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
до того, как триггеры работают нормально, вставка прошла успешно
В триггере перед вставкой вы можете изменить NEW. значения. Но из вашего кода или вопроса мне не ясно, получили ли вы цену за единицу до срабатывания триггера. Пожалуйста, просмотрите dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html