我在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;
答案 0 :(得分:1)
在触发器中,必须引用具有NEW
或OLD
伪表前缀的列。在你的情况下:
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 ;