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

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 student
FOR EACH ROW
BEGIN
    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 student
FOR EACH ROW
BEGIN
    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的基本用法,还学会了如何创建并使用触发器来约束数据的插入操作。这为我们今后在数据库管理和数据校验方面提供了有力的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值