繁体   English   中英

为什么我不断在“选择”附近出现“语法错误”。 预期设置错误?

[英]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语句需要关键字THENEND 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 ,如果一个操作数是nulltrue ,如果两者都null (常规=运算符返回null如果操作数是null 。)

要访问的列在记录中被更新,MySQL提供了OLDNEW包含的记录,因为它和这将是分别pseudorecords。 比较OLD列和NEW列会告诉您该列是否已更改。

大概是您要更新该作者的所有书籍的价格,而不是其他任何书籍的价格。 因此,你需要条件你UPDATE的作者ID,匹配books.author_id在无论是作者ID OLDNEW 我之所以选择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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM