基本SQL触发器

时间:2017-10-25 16:07:42

标签: 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. 更新任何PC的RAM或硬盘时,请检查更新的PC的硬盘数至少是RAM的100倍。

  2. 插入新的PC,笔记本电脑或打印机时,请确保先前未在PCLaptopPrinter中显示型号。< / p>

1 个答案:

答案 0 :(得分:0)

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

虽然你在这里正确。您需要SQL触发器才能完成上述任务。

注意:请自行尝试任务,如果你卡在某处,那就去吧 通过以下答案。

任务1:显然,它需要Update triggerPC。触发器将在PC上的每次更新时执行。

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

  

尝试插入或修改BEFORE触发器   行,无论后来的尝试是否成功。

因此,即使我们创建了触发器并显示错误消息,也可能会在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触发器,可以验证新模型编号是否尚未分配给任何PCPrinterLaptop独一无二。

<强>触发:

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;

完成!

希望它有所帮助!