MySQL的触发器创建与使用——使用Baidu Comate生成与触发测试完整过程

举报
红目香薰 发表于 2024/06/30 22:00:17 2024/06/30
【摘要】 ​DDL与DMLCREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号', `createDate` datetime DEFAULT NULL, `userName` varchar(20) DEFAULT NULL, `pwd` varchar(36) DEFAULT NULL, `phone` ...

DDL与DML

CREATE TABLE `student` (

`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',

`createDate` datetime DEFAULT NULL,

`userName` varchar(20) DEFAULT NULL,

`pwd` varchar(36) DEFAULT NULL,

`phone` varchar(11) DEFAULT NULL,

`age` tinyint(3) unsigned DEFAULT NULL,

`sex` char(2) DEFAULT '男',

`introduce` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `result` (

`rid` int(11) NOT NULL AUTO_INCREMENT COMMENT '成绩编号',

`testName` varchar(255) DEFAULT NULL COMMENT '测试名称',

`score` double(4,2) DEFAULT NULL COMMENT '成绩',

`studentId` int(11) DEFAULT NULL COMMENT '学生id',

PRIMARY KEY (`rid`),

KEY `studentId` (`studentId`),

CONSTRAINT `result_ibfk_1` FOREIGN KEY (`studentId`) REFERENCES `student` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;insert into student values(0,'2024-02-25 10:10:10','赵灵儿','123','15612345678',16,'女','逍遥哥哥,你终于找到我了。');insert into student values(0,'2024-02-25 10:10:10','王语嫣','123','15612345678',17,'女','慕容复,我和你不共戴天。');insert into student values(0,'2024-02-25 10:10:10','龙姑娘','123','15612345678',22,'女','我想过过过儿过过的日子。');insert into student values(0,'2024-02-25 10:10:10','杨过','123','15612345678',18,'男','一遇杨过误终身。');insert into student values(0,'2024-02-25 10:10:10','杨逍','123','15612345678',27,'男','杨过跟程英的大儿子。');insert into student (userName,age,introduce)values('黄衣女子',26,'杨过与龙姑娘的大女儿。');

insert into result values(0,'政治',96,1);insert into result values(0,'地理',86,5);insert into result values(0,'政治',77,3);insert into result values(0,'英语',99,3);insert into result values(0,'历史',22,6);insert into result values(0,'化学',69,2);insert into result values(0,'Java',79,5);insert into result values(0,'Java',67,6);insert into result values(0,'政治',97,2);insert into result values(0,'物理',76,6);insert into result values(0,'物理',82,2);insert into result values(0,'化学',56,4);

创建触发器提问

根据DDL与DML写一个触发器,要求在添加用户信息的时候不允许添加姓名为张王李赵的userName。

​编辑

返回结果:

为了实现在添加用户信息时不允许添加姓名为张、王、李、赵的userName,您可以创建一个BEFORE INSERT触发器。以下是一个可能的实现:

DELIMITER //

CREATE TRIGGER tr_before_insert_student

BEFORE INSERT ON studentFOR EACH ROWBEGIN

IF NEW.userName IN ('张', '王', '李', '赵') THEN

SIGNAL SQLSTATE '45000'

SET MESSAGE_TEXT = '不允许添加姓名为张、王、李、赵的用户';

END IF;END;

//


DELIMITER ;

这个触发器会在向student表插入新记录之前执行。如果新记录的userName字段值为'张'、'王'、'李'或'赵',触发器会发出一个错误信号,阻止插入操作并显示相应的错误消息。

请注意,上述代码假设您想要完全匹配'张'、'王'、'李'或'赵'这些单独的姓。如果您想要阻止包含这些字作为任何一部分的姓名(例如,'张三'、'王五'、'李丽'、'赵阳'),则需要使用LIKE操作符或正则表达式来进行更复杂的匹配。

如果您想要进行部分匹配,可以修改触发器如下:

DELIMITER //

CREATE TRIGGER tr_before_insert_student

BEFORE INSERT ON studentFOR EACH ROWBEGIN

IF NEW.userName LIKE '张%' OR NEW.userName LIKE '王%' OR NEW.userName LIKE '李%' OR NEW.userName LIKE '赵%' THEN

SIGNAL SQLSTATE '45000'

SET MESSAGE_TEXT = '不允许添加姓名以张、王、李、赵开头的用户';

END IF;END;

//


DELIMITER ;

这个修改后的版本会阻止任何以'张'、'王'、'李'或'赵'开头的userName被插入到student表中。

添加数据并测试触发器

写个DML语句要求添加一位叫做王晓易的人,其它信息随机。

为了向student表中添加一位叫做王晓易的人,并且其它信息随机,您可以使用以下的DML(Data Manipulation Language)语句。请注意,随机数据是使用MySQL内置的函数生成的,可能并不完全符合实际情况,但可用于测试或示例目的。

INSERT INTO `student` (`createDate`, `userName`, `phone`, `age`, `sex`, `introduce`)VALUES (

NOW(), -- 当前日期和时间

'王晓易',

CONCAT('1', FLOOR(RAND() * (999999999 - 100000000 + 1)) + 100000000), -- 随机生成11位手机号(以1开头)

FLOOR(RAND() * (50 - 16 + 1)) + 16, -- 随机生成16到50之间的年龄

IF(RAND() > 0.5, '男', '女'), -- 随机分配性别

CONCAT('这是', '王晓易', '的介绍。') -- 简单的介绍文本(可选,仅作示例)

);

这条INSERT INTO语句会向student表中添加一条新记录。userName字段被明确设置为'王晓易',而其他字段则被设置为随机值:

createDate:设置为当前日期和时间。

phone:生成一个随机的11位手机号码,以1开头。

age:生成一个介于16到50岁之间的随机年龄。

sex:使用RAND()函数随机分配'男'或'女'。

introduce:一个简单的介绍文本,包含用户名(可选,仅作示例)。

请根据您的实际需求调整这些随机生成数据的规则。如果您需要更真实的随机数据,可能需要考虑使用专门的数据生成工具或库。

实际测试结果-触发成示例

​编辑

正常添加非触发器信息

非限制数据正常添加。

​编辑

总结

在本次操作中,我们首先创建了两个数据表:student和result,分别用于存储学生信息和成绩信息。其中,student表包含了学生的基本信息字段,如学号、创建日期、用户名、密码、电话、年龄、性别和介绍等;而result表则记录了学生的成绩信息,包括成绩编号、测试名称、成绩和学生ID等。

随后,我们针对student表创建了一个重要的触发器tr_before_insert_student,其目的是为了实现在添加用户信息时,不允许添加姓名为张、王、李、赵的userName。该触发器会在向student表插入新记录之前执行检查,如果新记录的userName字段值包含被限制的姓氏,则会发出一个错误信号,从而阻止插入操作并给出相应的错误提示。这为我们的数据录入提供了一层有效的校验机制,确保了数据的准确性和合规性。

为了验证触发器的有效性,我们尝试向student表中插入了多条数据,包括合规的和不合规的用户名。通过实际测试,我们观察到当插入包含被限制姓氏的用户名时,触发器成功阻止了数据的插入,并给出了预设的错误消息。而对于其他合规的用户名,数据则能够正常添加到表中。

此外,我们还展示了如何向student表中插入一条特定用户名(如“王晓易”)的记录,同时为其他字段生成随机数据。这种插入方式可以应用于测试场景,其中随机数据能够帮助我们模拟更真实的数据环境。当然,在实际应用中,我们还需要根据具体需求来调整随机数据的生成规则,以确保数据的真实性和可用性。

综上所述,通过本次操作,我们不仅掌握了DDL和DML的基本用法,还学会了如何创建并使用触发器来约束数据的插入操作。这为我们今后在数据库管理和数据校验方面提供了有力的支持。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。