需求

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')

日志记录的情况:

results matching ""

    No results matching ""