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