mysql - 为什么我不断收到 'Incorrect Syntax near ' Select'.期待 Set' 错误?

标签 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

但是我的选择带有红色下划线,它给了我“‘选择’附近的语法不正确。期望设置。”错误。我该如何解决这个问题?

最佳答案

事实上,你的语法在所有方面都相差甚远。

首先,您要执行 books 的更新对于每个已去世的作者一次,因此您需要使用行触发器。

MySQL 没有(根据文档)实现 UPDATING谓词。测试这一点的方法是使用空安全比较运算符 <=> ,返回 false 如果一个操作数是 null true 如果两者都是 null 。 (如果任一操作数为 = ,常规 null 运算符将返回 null 。)

为了访问正在更新的记录中的列,MySQL 提供了 OLD NEW 伪记录,分别包含过去的记录。比较 OLD 中的列 NEW 会告诉您该列是否已更改。

您大概想更新该作者的所有图书的价格,而不是任何其他图书的价格。因此,您需要调节您的UPDATE在作者 ID 上,匹配 books.author_id作者 ID 位于 OLD NEW 。我选择了NEW 只是因为。

最后,根据评级更新为不同值的最简单方法就是执行两个 UPDATE s。

她是我建议的代码:

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;

关于mysql - 为什么我不断收到 'Incorrect Syntax near ' Select'.期待 Set' 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36438627/

相关文章:

MySQL 列出单个表中的一些字段并计算来自另一个表的所有特定字段引用

php - 获取数据数组时出现 Codeigniter 错误

mysql - 同一个表 Gas Orm 的多个外键

javascript - 暂时禁用触发器

mysql - mysql中的触发器不允许某些列对重复值

php - SQL UPDATE 查询出错

mysql - 添加 INNER JOIN 以将 ID 转换为另一个表中的值

mysql - 将 GROUP BY 的多个子查询转换为 JOIN

php - 使用 CONCAT 格式化 MySQL

postgresql - 是否可以将数据传递给 postgreSQL 触发器?