Navicat 博客

2019 年 8 月 21 日,由 Robert Gravelle 撰写

有一些非常好的理由可以解释为什么数据验证最好在数据库级别而不是在应用程序级别执行。例如,多个应用程序可以访问相同的数据源。因此,你可以依赖于数据的一致性和有效性,而不必依赖于在应用程序端应用可能在不同的实现中不一致的验证逻辑。此外,触发器是验证的理想选择,因为它们可以在插入或更新数据之前执行。触发器还可以防止在提供错误消息时应用数据库事务。

在今天的文章中,我们将在 Navicat Premium 编写一个触发器,用于验证 MySQL 数据库表上的插入操作。

设计触发器

我们将使用 Sakila 示例数据库。它包含一些以虚构影碟出租店为主题的相关表。在这里,他们在 Navicat Premium 导览窗格中的表如下图:

我们将把触发器添加到 film 表中。如果你在设计器中打开它,你会看到有几个选项卡:

点击“触发器”选项卡可显示已为该表定义的一些触发器。例如,在数据插入 film 表时,ins_film触发器将电影信息复制到 film_text 表中。这是触发器的常见任务。

现在我们将添加一个新触发器,确保使用 original_language_id 插入外国电影。

电影的语言实际存储在 language 查找表中:



language_id    name    last_update
1    English    2006-02-15 05:02:19
2    Italian    2006-02-15 05:02:19
3    Japanese    2006-02-15 05:02:19
4    Mandarin    2006-02-15 05:02:19
5    French    2006-02-15 05:02:19
6    German    2006-02-15 05:02:19

除了值为 1 之外的任何其他 language_id 也应具有 original_language_id。我们的触发器将检查 original_language_id 列中的值。

  • 在 film 表的设计视图中,选择“触发器”选项卡,然后点击“添加触发器”按钮。
    这将在触发器表中添加一个新行。
  • 为触发器指定名称“ins_validate_language”,从“触发”下拉菜单中选择“BEFORE”,然后点击“插入”复选框。
  • 这是触发器主体:
    BEGIN
      IF NEW.language_id != 1 AND NEW.original_language_id IS NULL
      THEN
        SIGNAL SQLSTATE '45000'
          SET MESSAGE_TEXT = 'Original language id is required for Foreign language films.';
      END IF;
    END

    这是我们填写了所有字段的触发器:
  • 点击“保存”按钮以创建触发器。

测试触发器

现在是时候验证我们的触发器是否按预期工作。为了测试它,让我们用一个外语 language_id 为 film 表添加一个新行。

  • 在编辑器中打开 film 表。
  • 导航到最后一行。
  • 选择“表单视图”,然后点击加号(+)按钮添加新行:
  • 在表单中,你只需输入 title 和 language_id,所有其他字段都具有默认值或不是必需的。
  • 点击“添加”(勾号)按钮时,你应该看到我们的错误消息:

总结

触发器是数据验证的理想选择,因为它们可以在插入或更新数据之前执行。我们通过在 Navicat Premium中编写触发器,了解如何将触发器用于验证目的。

Navicat 文章
频道条目
分享
文章归档