在插入触发器之前阻止执行INSERT INTO语句

时间:2014-03-12 10:59:54

标签: mysql triggers

我在MySQL Workbench 5.6中执行以下sql代码时遇到问题。该表是有序创建的,触发器创建代码也运行无误。但是,当我尝试将两个插入运行到语句中时,我有一个错误错误代码:1054。'字段列表'中的未知列'通过'。如果我运行最后一个select语句,它也会按预期运行!?

我无法想象在运行触发器创建脚本后发生了什么事情!

如果我在插入语句之前没有运行triger创建代码,它们将按预期执行,并且数据将插入到列中。

/ * TASK 15:编写一个SQL语句来创建表Users。用户应该有用户名,  密码,全名和上次登录时间。为表字段选择适当的数据类型。  使用主键约束定义主键列。定义主键列 作为身份以便于插入记录。定义唯一约束以避免重复 用户名。定义检查约束以确保密码长度至少为5个字符。 * /

 create table Users(
    UserID int auto_increment not null,
    Username nvarchar(50) not null,
    Pass varchar(100) not null,
    FullName nvarchar(100),
    LastLoginTime datetime,
    constraint PK_Users primary key(UserID),
    constraint UK_Users_Username UNIQUE(Username),
    constraint CH_Users_Password CHECK(length(users.Pass)>=5)
     );

DELIMITER $$
CREATE TRIGGER `TR_BeforeInsert_Users`
BEFORE INSERT ON `users`
FOR EACH ROW
BEGIN
    IF LENGTH(`Pass` ) < 5 THEN
    SIGNAL SQLSTATE '12345'
        SET MESSAGE_TEXT = 'check constraint on Pass failed';
    END IF;
END$$
delimiter ;

Insert into Users(Username, Pass, FullName,lastlogintime) values('ttitto','alabala','Todor', now());
Insert into Users(Username, Pass, FullName,lastlogintime) values('ttitt','ala','Todor', now());
select length(Pass) from users;

1 个答案:

答案 0 :(得分:1)

在触发器中,必须引用具有NEWOLD伪表前缀的列。在你的情况下:

DELIMITER $$
CREATE TRIGGER `TR_BeforeInsert_Users`
BEFORE INSERT ON `users`
FOR EACH ROW
BEGIN
    IF CHAR_LENGTH(NEW.Pass) < 5 THEN
    SIGNAL SQLSTATE '12345'
        SET MESSAGE_TEXT = 'check constraint on Pass failed';
    END IF;
END$$
delimiter ;