Mysql 为什么我总是在“选择”附近得到“不正确的语法”。应为“Set”错误?

Mysql 为什么我总是在“选择”附近得到“不正确的语法”。应为“Set”错误?,mysql,sql,triggers,Mysql,Sql,Triggers,我正在触发我的数据库。在本例中,我正在经营一家书店,我有一个作者表和一个图书表。作者表包含作者的id、姓名、姓氏、出生日期和死亡日期。My books表包含图书id、作者id、零售价、出版日期和图书评级。我正试图创造一个触发器,在作者去世后,将任何评级低于6的书的价格翻倍,如果评级为6,则只需将价格提高50%。基本上,如果修改了authors表中的death date列,那么books表中的零售价格列也应该修改。这是我的代码: CREATE TRIGGER author_death on aut

我正在触发我的数据库。在本例中,我正在经营一家书店,我有一个作者表和一个图书表。作者表包含作者的id、姓名、姓氏、出生日期和死亡日期。My books表包含图书id、作者id、零售价、出版日期和图书评级。我正试图创造一个触发器,在作者去世后,将任何评级低于6的书的价格翻倍,如果评级为6,则只需将价格提高50%。基本上,如果修改了authors表中的death date列,那么books表中的零售价格列也应该修改。这是我的代码:

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
但是,我的select用红色下划线,它在“select”附近给出了不正确的语法。期待集合。错误如何修复此问题?

我相信MySQL IF语句需要关键字THEN和END IF,它们似乎缺失了

是打算更新所有书籍的零售价格,还是只更新某位作者的书籍?我在UPDATE语句中没有看到WHERE子句或任何其他条件逻辑

我怀疑您希望更新声明的格式为:

 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语句中测试该表达式

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

实际上,您在所有方面的语法都有相当大的差距

首先,您希望为每位去世的作者执行一次书籍更新,因此需要使用行触发器

MySQL没有根据文档实现更新谓词。测试方法是使用空安全比较运算符,如果一个操作数为空,则返回false;如果两个操作数都为空,则返回true。如果任一操作数为null,则正则=运算符返回null

为了访问正在更新的记录中的列,MySQL提供旧的和新的伪记录,它们分别包含记录的原样和将来的原样。比较新旧列将告诉您该列是否已更改

想必,您希望更新该作者所有书籍的价格,而不是任何其他书籍的价格。因此,您需要根据作者ID进行更新,将books.author_ID与旧版或新版的作者ID进行匹配。我选择新的只是因为

最后,根据评级更新不同值的最简单方法是执行两次更新

她是我建议的代码:

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;

在文档中查找更新语法。具有讽刺意味的是,这是一本书,我如何在触发器下插入它?也谢谢你的帮助。