mysql - 基本 SQL 触发器

标签 mysql sql triggers

我是 MySQL 新手,所以我对回答这些问题的正确语法感到困惑。架构如下:

Product (maker, model, type)
PC (model, speed, ram, hdisk, price)
Laptop (model, speed, ram, hdisk, screen, price)
Printer (model, color, type, price)
  1. 更新任何电脑的 RAM 或硬盘时,请检查更新后的电脑的硬盘容量是否至少是 RAM 的 100 倍。

  2. 插入新电脑、笔记本电脑或打印机时,请确保型号之前未出现在 PC 中的任何一个中。 , Laptop ,或Printer .

最佳答案

从您的问题描述来看,我假设您是 SQL/MySql 新手。

虽然你在这里走在正确的轨道上。您需要 SQL 触发器来完成上述任务。

注意:请自行尝试该任务,如果您卡在某处,则只能去 通过下面的答案。

任务 1:显然,它需要在桌面 PC 上有一个更新触发器。触发器将在 PC 上的每次更新时执行。

但是,以下是来自 Mysql 文档 ( link ) 的声明:

A BEFORE trigger is activated by the attempt to insert or modify the row, regardless of whether the attempt subsequently succeeds.

因此,即使我们创建触发器并显示错误消息,更新仍可能在 PC 上进行。

为了防止更新过程,我们将在触发器内使用SQLState

MySql 中的每次故障都有唯一的 SQLStateSignal,我们将设置相关的 SQLState 以防止在 PC 上更新.

触发器:

CREATE TRIGGER BF_UPD_PC
     BEFORE UPDATE ON PC  FOR EACH ROW
     BEGIN
          IF NEW.hdisk >= 100*(NEW.ram) 
          THEN
               SIGNAL SQLSTATE '45000'
                    SET MESSAGE_TEXT = 'Cannot add or update row: HardDisk should be at least 100 times more than RAM.';
          END IF;
     END;

任务 2:

在这里,我们需要创建一个 Before Insert 触发器,它可以验证新型号尚未分配给任何 PCPrinter笔记本电脑,因为它应该是独一无二的。

触发器:

CREATE TRIGGER BF_INS_PRODUCT
     BEFORE INSERT ON PRODUCT
     BEGIN
          IF NEW.model in (select distinct model from pc
                           union all
                           select distinct model from printer
                           union all
                           select distinct model from laptop)
          THEN
               SIGNAL SQLSTATE '45000'
                    SET MESSAGE_TEXT = 'Cannot add or update row: Model number already assigned. Please try with another model number';
          END IF;
     END;

完成!

希望对你有帮助!

关于mysql - 基本 SQL 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46937211/

相关文章:

MySQL --- 在同一个表上设置操作 MINUS 和 INTERSECT

mysql - 使用 LAST_INSERT_ID 插入

mysql - 将列中的值更改为同一列中的另一个值

java - SEC_TO_TIME() 转换为 java.sql.Time 错误

php - 使用连接表更新

MySQL SELECT 语句,其中请求参数的字符多于数据库中的内容

javascript - 以一对一的关系插入数据belongsTo Sequelize

mysql - 我可以在 MySQL 触发器中使用类似事务的功能吗

mysql - 如果某些数据相同,如何使用触发器插入数据

mysql - 无法使用本地服务器连接到数据库,出现空白屏幕