我正在为我的数据库制作一个触发器。在这种情况下,我正在经营一家书店,我有一张作家桌,我有一张书桌。作者表包含作者的ID,姓名,姓氏,出生日期和死亡日期。我的书籍表包含book_id,作者ID,零售价,发布日期和书的评级。我试图创造一个触发器,在其作者死亡时评级低于6的任何一本书的价格翻倍,如果评级为6,它只是将价格提高50%。基本上,如果修改了作者表上的死亡日期列,则还应修改书籍表上的零售价格列。这是我的代码:
CREATE TRIGGER author_death
on authors
AFTER UPDATE AS
BEGIN
IF UPDATE(death)
Begin
UPDATE books.retail_price
SELECT CASE
when rating > 6 then retial_price * 2
when rating = 6 then retail_price *1.5
END
但是我的选项用红色加下划线,它在'选择'附近给了我"不正确的语法。期待着。"错误。我该如何解决这个问题?
答案 0 :(得分:0)
我认为MySQL IF
语句需要关键字THEN
和END IF
,这些关键字似乎缺失。
是否有意更新所有图书的零售价格,或仅更新特定作者的图书?我在UPDATE
语句中没有看到WHERE子句或任何其他条件逻辑。
我怀疑您希望UPDATE
声明符合以下格式:
UPDATE mytable
SET pricecolumn = expr
WHERE authorcol = somevalue
表达式expr
返回您要分配的值...
= mytable.myprice * CASE
WHEN mytable.myrating < 6 THEN 2.0
WHEN mytable.myrating = 6 THEN 1.5
ELSE 1.0
END
在UPDATE中使用它之前,您可能希望在SELECT语句中测试该表达式
SELECT mytable.myrating
, mytable.myprice
, mytable.myprice * CASE
WHEN mytable.myrating < 6 THEN 2.0
WHEN mytable.myrating = 6 THEN 1.5
ELSE 1.0
END AS new_price
FROM mytable
WHERE authorcol = somevalue
答案 1 :(得分:0)
你在所有方面的语法实际上相当远。
首先,您希望为死亡的每个作者执行一次的books
更新,因此您需要使用行触发器。
MySQL没有(根据文档)实现UPDATING
谓词。测试此方法的方法是使用空安全比较运算符<=>
,如果一个操作数为 false
,则返回 null
和 true
如果两者都 null
。 (如果任一操作数为 =
,则常规null
运算符会返回 null
。)
要访问正在更新的记录中的列,MySQL提供 OLD
和 NEW
伪记录,其中包含记录 ,因为它将分别为。比较 OLD
和 NEW
中的列会告诉您该列是否已更改。
据推测,您希望更新该作者所有书籍的价格,而不是任何其他书籍。因此,您需要在{strong> UPDATE
或 books.author_id
上对作者ID OLD
进行调整,将NEW
与作者ID匹配即可。我之所以选择 NEW
是因为。
最后,根据评分更新为不同值的最简单方法是执行两个UPDATE
。
她是我推荐的代码:
CREATE TRIGGER author_death
AFTER UPDATE
ON authors
FOR EACH ROW
BEGIN
IF NOT (OLD.death <=> NEW.death)
THEN
UPDATE books
SET retail_price = retail_price * 2
WHERE rating < 6
AND author_id = NEW.id;
UPDATE books
SET retail_price = retail_price * 1.5
WHERE rating = 6
AND author_id = NEW.id;
END IF;
END;