创建一个触发器,当向study表插入记录时,对成绩进行合法性验证,当成绩不合法时,不能插入该记录。

使用sqlyog创建了三个数据库并且进行了数据的插入如下(无错误)

img

CREATE DATABASE liu;
USE liu;
CREATE TABLE student
(Sno VARCHAR(50) NOT NULL PRIMARY KEY,
Sname VARCHAR(50),
Age INT,
Sex VARCHAR(50),
Place VARCHAR(50));
CREATE TABLE Course
(Cno VARCHAR(50) PRIMARY KEY,
Cname VARCHAR(50),
Credit INT
)
CREATE TABLE Study
(
 Sno VARCHAR(50) NOT NULL,
 Cno VARCHAR(50) NOT NULL,
 Grage INT ,
 PRIMARY KEY(Sno,Cno)
)
INSERT INTO student
VALUES('201215121','李勇',20,'男','广东'),
('201215122','刘晨',19,'女','湖北'),
('201215123','王敏',18,'女','江西'),
('201215125','张立',19,'男','湖北'),
('201215126','汪明',18,'男','湖北');
INSERT INTO Course
VALUES('C01','数据库',3),
('C02','C语言',4),
('C03','操作系统',4),
('C04','数据结构',4),
('C05','软件工程',2);
INSERT INTO Study
VALUES('201215121','C01',92),
('201215121','C05',85),
('201215122','C01',90),
('201215122','C03',80),
('201215123','C02',87),
('201215123','C04',79);

对(1)和(2)进行了创建(无错误),如何求解(3),以及对存储器创建完成后,且0error,如何验证其功能符合要求

img

img

DROP PROCEDURE IF EXISTS student_info;
DELIMITER $$
CREATE PROCEDURE student_info()
BEGIN 
SELECT a.Sno,Sname,Cname,Grage,Credit
FROM Student a INNER JOIN Study b ON a.Sno=b.Sno INNER JOIN Course t ON b.Cno=t.Cno;
SELECT AVG(Grage)AS average,SUM(Credit) AS sumcredit
FROM Study INNER JOIN Course ON Study.Cno=Course.Cno
GROUP BY Sno;
END $$
DELIMITER ;
CALL student_info;

DROP TRIGGER IF EXISTS delete_trig;
DELIMITER $$
CREATE TRIGGER delete_trig
AFTER DELETE
ON Course FOR EACH ROW
BEGIN 
DECLARE xh CHAR(9);
SET xh=old.Cno;
DELETE FROM Study
WHERE Cno=xh;
END $$
DELIMITER ;

DROP TRIGGER IF EXISTS insert_trig;
DELIMITER $$
CREATE TRIGGER insert_trig
before insert
ON study FOR EACH ROW
BEGIN 
if new.Grage <0 or new.Grage >100 then 
signal sqlstate 'HY000' set message_text = '得分需要大于等于0,小于等于100';
end if;
END $$
DELIMITER ;

验证就是插入分数不合格的,比如小于0或者大于100的分数,会抛出错误

INSERT INTO Study
VALUES('201215121','C01',150)

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7726883
  • 这篇博客也不错, 你可以看下数据库有多个字段和类的属性名称不一致的快速解决办法,一键替换小技巧,SQLyog快速生成sql语句
  • 除此之外, 这篇博客: 4、数据库服务的启动与登录中的 3、SQLyog 图形化工具——客户端 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    SQLyog 是业界著名的 Webyog 公司出品的一款简洁高效、功能强大的图形化 MySQL 数据库管理工具。使用 SQLyog 可以快速直观地让您从世界的任何角落通过网络来维护远端的 MySQL 数据库

    在这里插入图片描述

    使用 SQLyog 登录数据库

    在这里插入图片描述

  • 以下回答来自chatgpt:

    答案:

    创建验证成绩合法性的触发器:

    步骤1:打开SQLyog,选择要创建触发器的数据库。

    步骤2:在“对象管理器”中,右击数据表“study”,选择“设计表”,打开“设计表窗口”。

    步骤3:在“设计表窗口”中,选择“触发器”标签页,点击“新建触发器”。

    步骤4:在“新建触发器窗口”中,输入触发器名称“check_score”,选择“Before insert”(在插入之前)。在“触发器程序”文本栏中输入以下SQL语句(代码中的限制为成绩不能大于100):

    IF NEW.score > 100 THEN
      SIGNAL SQLSTATE '45000'
       SET MESSAGE_TEXT = '成绩不合法';
    END IF;
    

    步骤5:保存触发器并关闭“设计表窗口”。

    验证触发器是否工作:

    步骤1:在SQLyog中,打开“query”标签页。

    步骤2:输入以下SQL语句来插入一条不合法的记录:

    INSERT INTO study (id, name, score) VALUES (1, 'Jack', 110);
    

    步骤3:查看输出,应该会出现 “#1644 - 成绩不合法” 的错误信息,说明触发器生效了。

    步骤4:输入以下SQL语句来插入一条合法的记录:

    INSERT INTO study (id, name, score) VALUES (2, 'Lucy', 80);
    

    步骤5:查看输出,应该会显示成功插入 1 条记录。

    至此,我们验证了触发器已经生效,并能够拦截插入不合法的记录。

    如果你是第一次使用SQLyog,需要在“SQLyog连接MySQL数据库”之前按照段落1中的方法设置密码,确保能够连接数据库。

    参考资料: 1. SQL 触发器相关知识:https://www.runoob.com/sql/sql-trigger.html 2. SQLyog 常用操作:https://blog.csdn.net/weixin_44212920/article/details/86732192


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^