我正在创建一个数据库,我用触发器验证输入数据。我成功添加了它们,但是当我尝试输入精确数据时出错。
创建数据库,表和触发器
CREATE DATABASE IF NOT EXISTS DBWorkers;
CREATE TABLE IF NOT EXISTS Ludzie(
PESEL char(11) NOT NULL,
imie varchar(30) NOT NULL,
nazwisko varchar(30) NOT NULL,
data_urodzenia date NOT NULL,
wzrost float NOT NULL,
waga float NOT NULL,
rozmiar_buta int NOT NULL,
PRIMARY KEY(PESEL));
DELIMITER $$
CREATE FUNCTION check_pesel(PESEL char(11)) RETURNS bool
BEGIN
IF(
CHAR_LENGTH(NEW.PESEL) <> 11 AND
CONVERT(PESEL, SIGNED INT) > 0 AND
CONVERT(LEFT(PESEL,2), SIGNED INT) BETWEEN 0 AND 99 AND
CONVERT(SUBSTRING(PESEL,3,2), SIGNED INT) BETWEEN 1 AND 12 AND
CONVERT(SUBSTRING(PESEL,3,2), SIGNED INT) BETWEEN 1 AND DAY(LAST_DAY(CONCAT('19',LEFT(PESEL,2),'-',SUBSTRING(PESEL,3,2),'-01')))
)
THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END $$
CREATE TRIGGER `ludzie_data_check_before_insert` BEFORE INSERT ON `Ludzie`
FOR EACH ROW
BEGIN
IF NOT(
check_pesel(NEW.PESEL) AND
NEW.WZROST > 0.0 AND
NEW.WAGA > 0.0 AND
NEW.ROZMIAR_BUTA > 0
)
THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'check on Ludzie failed during insert';
END IF;
END $$
DELIMITER ;
当我尝试按
输入数据时INSERT INTO Ludzie VALUES ('7810396705', 'Anders', 'Kennedy','1958-08-20', 1.70, 88.6, 43)
我得到了
Error Code: 1109. Unknown table 'new' in field list
我已经尝试打开和关闭mysql服务器,检查我是否正在向正确的数据库执行此操作。一切看起来都很好,但事实并非如此:/
答案 0 :(得分:2)
我想我找到了你的问题:
CHAR_LENGTH(NEW.PESEL) <> 11 AND
CONVERT(PESEL, SIGNED INT) > 0 AND
这是NEW.PESEL和PESEL的不一致用法,您不应该在不向数据库添加任何内容的函数中使用关键字new。在此上下文中,错误将NEW识别为表而不是关键字。
答案 1 :(得分:1)
是的,在做了一些阅读后我也愿意打赌
中不需要“NEW”关键字CHAR_LENGTH(NEW.PESEL)。
NEW关键字用于更新和插入命令。