我的触发语句有什么问题吗?

时间:2019-03-27 14:50:00

标签: mysql stored-procedures triggers

创建触发器语句后,我无法正常插入数据,但程序会引发错误: 错误代码1109:字段列表中的未知表'user'。

--create table
CREATE TABLE `user` (
  `user_id` int(11) NOT NULL,
  `email` varchar(45) DEFAULT NULL,
  `username` varchar(45) NOT NULL,
  `password` varchar(45) NOT NULL,
  `phone_number` int(11) DEFAULT NULL,
  `type` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--create trigger
DELIMITER $$
CREATE TRIGGER Checkinfo
    before INSERT ON dbi_202x.user FOR EACH ROW 
    BEGIN
        if( user.email not REGEXP '^[^@]+@[^@]+\.[^@]{2,}$')
        THEN 
            SET new.email = `wrong email`;
        end if;
    END;
$$
--insert data
INSERT INTO `dbi_202x`.`user`(`user_id`,`email`,`username`,`password`,`phone_number`,`type`)VALUES(
396812,
'sdf@sxcv.com',
'sadfk23',
'asdf',
1369846978,
'employee');

您能帮我找出为什么这行不通吗?

1 个答案:

答案 0 :(得分:1)

您可以在不使用触发器的情况下在MySQL客户端中测试正则表达式:

mysql> select 'user@example.com' REGEXP '^[^@]+@[^@]+\.[^@]{2,}$' as email_match;
+-------------+
| email_match |
+-------------+
|           1 |
+-------------+

这是预料之中的,但是如果我们给它发送无效的电子邮件怎么办?

mysql> select 'user@example.' REGEXP '^[^@]+@[^@]+\.[^@]{2,}$' as email_match;
+-------------+
| email_match |
+-------------+
|           1 |
+-------------+

应该是0,但为什么不呢?

因为\.不足以转义正则表达式中的点。 SQL解析字符串时,单个\丢失了。我们需要一个正则表达式字符串中的文字\来转义点。因此,我们必须使用双\\,以便在MySQL扫描一次后,在正则表达式中保留单个文字\

mysql> select 'user@example.' REGEXP '^[^@]+@[^@]+\\.[^@]{2,}$' as email_match;
+-------------+
| email_match |
+-------------+
|           0 |
+-------------+

P.S。就其价值而言,电子邮件比简单的验证要复杂得多。这个古老的存档博客尝试了多种电子邮件验证方法:https://web.archive.org/web/20150910045413/http://squiloople.com/2009/12/20/email-address-validation

其中最成功的方法成为PHP's FILTER_VALIDATE_EMAIL中使用的正则表达式。