gpt4 book ai didi

mysql - 插入触发器之前阻止执行以下 INSERT INTO 语句

转载 作者:行者123 更新时间:2023-11-29 13:08:52 27 4
gpt4 key购买 nike

我在 MySQL Workbench 5.6 中执行以下 SQL 代码时遇到问题。表已有序创建,触发器创建代码也运行无错误。但是,当我尝试运行两个 insert into 语句时,出现错误错误代码:1054。“字段列表”中存在未知列“通过”。如果我运行最后一个选择语句,它也会按预期运行!?

我真的无法想象运行触发器创建脚本后会发生什么!?

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

/*任务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;

最佳答案

在触发器内,必须引用带有 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 ;

关于mysql - 插入触发器之前阻止执行以下 INSERT INTO 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22349388/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com