mysql - 我的触发语句有问题吗?

标签 mysql stored-procedures triggers

创建触发器语句后,我无法正常插入数据,但程序抛出错误: 错误代码 1109:字段列表中的未知表“用户”。

--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 客户端中测试正则表达式:

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 |
+-------------+

附言就其值(value)而言,电子邮件比您的简单验证要复杂得多。这个旧的存档博客多次尝试进行全面的电子邮件验证: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/

相关文章:

MySQL 多个数据库和用户

mysql - 找不到匹配的 SQL 类。 Drush 找不到您的数据库连接。错误

sql - 如何在 vb.net 代码中使用 SQL Server 存储过程中的 OUT 参数

oracle - 调用过程时的 PL/SQL 事务

mysql - 创建一个 "After Insert"触发器

java - H2 java.lang.ClassNotFoundException 用于在类路径中传递的触发器

mysql - 为什么 MySQL 查询有两个 WHERE 这么慢

mysql - 在 CakePHP 中计算新的平均 afterSave(或更好的东西?)

sql-server - 如何在 sp_executesql 中使用 OPENQUERY?

triggers - Dafny 没有条件可以触发谓词