如何创建具有 if 条件的 SQL 触发器?

时间:2021-03-03 17:37:11

标签: mysql

我现在正在大学学习数据库入门课程,我们的任务是创建一个基本的 Flickr 克隆网络应用程序。我已经创建了所有表,但似乎无法正确创建触发器。我的伙伴也无法弄清楚这个问题。此应用程序的一个条件是相册的所有者不能更改。目前,我们的触发器如下所示:

CREATE TRIGGER ownerChange
    BEFORE UPDATE ON Albums
    FOR EACH ROW
    BEGIN
        -- owner is a column of the Albums table
        IF (NEW.owner <> OLD.owner) THEN
            -- Our textbook mentions using "RAISE_APPLICATION_ERROR",
            -- but the darn book is 20 years old, and Googling suggests
            -- using SIGNAL instead.
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Changing album owner is not allowed.'
        END IF
    END

如果我删除数据库并尝试干净地获取包含此触发器的架构,则表都创建得很好,但我收到

ERROR 1064 (42000): You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near 'END IF
    END' at line 75

我使用的是 MySQL 8.0.23 版。

1 个答案:

答案 0 :(得分:0)

您缺少两个分号

就像在示例中看到的那样。

<块引用>
CREATE TABLE Albums (
  `owner` INTEGER
);
<块引用>
CREATE TRIGGER ownerChange
    BEFORE UPDATE ON Albums
    FOR EACH ROW
    BEGIN
        -- owner is a column of the Albums table
        IF (NEW.owner <> OLD.owner) THEN
            -- Our textbook mentions using "RAISE_APPLICATION_ERROR",
            -- but the darn book is 20 years old, and Googling suggests
            -- using SIGNAL instead.
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Changing album owner is not allowed.';
        END IF;
    END
<块引用>
INSERT INTO Albums VALUES (1);
<块引用>
UPDATE Albums SET owner = 2 WHERE owner = 1;
Changing album owner is not allowed.
<块引用>
SELECT * FROM Albums;
| owner |
| ----: |
|     1 |

db<>fiddle here

在 mysql Workbench 之外,你还需要 DELIMITER

DELIMITER $$
CREATE TRIGGER ownerChange
    BEFORE UPDATE ON Albums
    FOR EACH ROW
    BEGIN
        -- owner is a column of the Albums table
        IF (NEW.owner <> OLD.owner) THEN
            -- Our textbook mentions using "RAISE_APPLICATION_ERROR",
            -- but the darn book is 20 years old, and Googling suggests
            -- using SIGNAL instead.
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Changing album owner is not allowed.';
        END IF;
    END$$
DELIMITER ;
相关问题