我正在为我的数据库创建一个触发器。在本例中,我正在经营一家书店,我有一个作者表和一个书籍表。作者表包含作者的 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/