需求
1、判断用户名和密码是否匹配,如果匹配则返回该行数据,如果不匹配则返回一个错误行
2、不管成功不成功都记录一次日志。
先创建 user_log 日志表:
请注意,这里故意加入了“冗余”字段 user_name ,实际上这是不符合sql表设计原则的。
但实战的情况往往还需要为了查询用户名而关联用户表。加入这个”冗余”字段不仅可以提高效率,还可以加快查询速度。
毕竟像用户表这种使用率比较频繁的,还可能进行锁表。所以少关联总是好的。
如果在约定和效率面前,一定是选择后者。
事实上不只是这种日志场景,在许多场景下,适当的添加“冗余”字段有利于提高查询速度和开发效率。
-- ----------------------------
-- Table structure for `user_log`
-- ----------------------------
DROP TABLE IF EXISTS `user_log`;
CREATE TABLE `user_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(20) NOT NULL,
`user_name` varchar(20) NOT NULL,
`log_type` varchar(20) NOT NULL,
`log_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user_log
-- ----------------------------
创建存储过程 login_user
IN _user_name varchar(20), IN _user_pwd varchar(20)
BEGIN
SET @gid = 0;
SET @user_name = '';
SET @result = 'success';
SELECT id, user_name INTO @gid, @user_name FROM user_innodb WHERE user_name = _user_name AND user_pwd = _user_pwd LIMIT 1;
# 登录失败
IF @gid = 0 THEN
SET @result = 'fail';
END IF;
# 插入日志
INSERT INTO user_log (user_id, user_name, log_type) VALUES (@gid, _user_name, @result);
# 返回结果
SELECT * FROM (SELECT @result AS _result) AS a, (SELECT @gid, @user_name) AS b;
END
调用存储过程示例:
call user_login('user34', '123')
查询失败的情况:
call user_login('nothing', '123')
日志记录的情况: