为什么我一直在'选择'附近得到“不正确的语法”。期待Set'错误?

时间:2016-04-05 23:05:21

标签: mysql sql triggers

我正在为我的数据库制作一个触发器。在这种情况下,我正在经营一家书店,我有一张作家桌,我有一张书桌。作者表包含作者的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

但是我的选项用红色加下划线,它在'选择'附近给了我"不正确的语法。期待着。"错误。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我认为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

在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;