创建触发器语句后,无法正常插入数据,但程序抛出错误:
错误代码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');
你能帮我找出为什么这不起作用吗?
最佳答案
您可以在MySQL客户机中测试regexp,而无需使用触发器:
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解析字符串时丢失。正则表达式字符串中需要一个文本\
来转义点。所以我们必须使用一个double\\
,这样在MySQL扫描了一次正则表达式之后,正则表达式中就只剩下一个literal\
。mysql> select 'user@example.' REGEXP '^[^@]+@[^@]+\\.[^@]{2,}$' as email_match;
+-------------+
| email_match |
+-------------+
| 0 |
+-------------+
不管怎样,电子邮件比你简单的确认要复杂得多。这个旧的存档博客有几次尝试进行全面的电子邮件验证:https://web.archive.org/web/20150910045413/http://squiloople.com/2009/12/20/email-address-validation
其中最成功的是PHP's FILTER_VALIDATE_EMAIL中使用的正则表达式。
关于mysql - 我的触发语句有什么问题吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55380155/