[英]Why do I keep getting the 'Incorrect Syntax near 'Select'. Expecting Set' error?
我正在触发数据库。 在这种情况下,我经营一家书店,有一个作者表和一个书表。 作者表包含作者的ID,姓名,姓氏,出生日期和死亡日期。 我的图书表包含book_id,作者ID,零售价,出版日期和图书评级。 我正在尝试创建一个触发器,该触发器将在作者死亡时将评级低于6的任何书籍的价格翻倍,如果评级为6,则将价格提高50%。 基本上,如果对authors表上的死亡日期列进行了修改,则book表上的零售价格列也应进行修改。 这是我的代码:
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
但是,我的选择用红色下划线标出,它使我“选择”附近的语法不正确。 错误。 我怎样才能解决这个问题?
我相信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
您可能需要先在SELECT语句中测试该表达式,然后再在UPDATE中使用该表达式
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
实际上,所有方面的语法您都相去甚远。
首先,您要为每位去世的作者执行一次books
更新,因此您需要使用行触发器。
MySQL没有(根据文档)不实现UPDATING
谓词。 来测试这个问题的方法是使用空安全的比较操作, <=>
,它返回false
,如果一个操作数是null
和true
,如果两者都null
。 (常规=
运算符返回null
如果操作数是null
。)
要访问的列在记录中被更新,MySQL提供了OLD
和NEW
包含的记录,因为它是和这将是分别pseudorecords。 比较OLD
列和NEW
列会告诉您该列是否已更改。
大概是您要更新该作者的所有书籍的价格,而不是其他任何书籍的价格。 因此,你需要条件你UPDATE
的作者ID,匹配books.author_id
在无论是作者ID OLD
或NEW
。 我之所以选择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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.