我是MySQL的新手,所以我对回答这些问题的正确语法感到困惑。架构如下:
Product (maker, model, type)
PC (model, speed, ram, hdisk, price)
Laptop (model, speed, ram, hdisk, screen, price)
Printer (model, color, type, price)
更新任何PC的RAM或硬盘时,请检查更新的PC的硬盘数至少是RAM的100倍。
插入新的PC,笔记本电脑或打印机时,请确保先前未在PC
,Laptop
或Printer
中显示型号。< / p>
答案 0 :(得分:0)
从您的问题描述中,我假设您是SQL / MySql的新手。
虽然你在这里正确。您需要SQL触发器才能完成上述任务。
注意:请自行尝试任务,如果你卡在某处,那就去吧 通过以下答案。
任务1:显然,它需要Update trigger
表PC
。触发器将在PC
上的每次更新时执行。
但是,以下是来自Mysql文档(link)的声明:
尝试插入或修改BEFORE触发器 行,无论后来的尝试是否成功。
因此,即使我们创建了触发器并显示错误消息,也可能会在PC
上进行更新。
为防止更新过程,我们会在触发器内使用SQLState
。
MySql中的每个失败都有唯一的SQLState
或Signal
,我们会设置相关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
触发器,可以验证新模型编号是否尚未分配给任何PC
,Printer
或Laptop
独一无二。
<强>触发:强>
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;
完成!
希望它有所帮助!