虽然这里有很多类似于我现在遇到的问题,但我尝试的答案都没有用。鉴于以下表格和触发器脚本,为什么会遇到标题主题的原因和解决方法是什么。
CREATE TABLE todolist (
sequence_number INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
to_do_item VARCHAR(45) NOT NULL,
done_status BOOLEAN DEFAULT FALSE,
active_flag BOOLEAN DEFAULT TRUE,
last_action_code VARCHAR(45) NOT NULL,
create_pid VARCHAR(45),
create_datetime TIMESTAMP,
read_pid VARCHAR(45),
read_datetime TIMESTAMP,
update_pid VARCHAR(45),
update_timestamp TIMESTAMP,
delete_pid VARCHAR(45),
delete_timestamp TIMESTAMP,
logical_delete_flag BOOLEAN DEFAULT FALSE
);
DELIMITER ;;
CREATE TRIGGER todolist_trigger_on_record_insert
BEFORE INSERT ON todolist
FOR EACH ROW
BEGIN
SET NEW.create_datetime = NOW(),
NEW.create_pid = 'todolist_trigger_on_record_insert',
NEW.last_action_code = 'INSERT';
END;;
DELIMITER ;
DELIMITER ;;
CREATE TRIGGER todolist_trigger_on_record_update
BEFORE UPDATE ON todolist
FOR EACH ROW
BEGIN
IF (logical_delete_flag IS TRUE) THEN
SET NEW.delete_timestamp = NOW(),
NEW.delete_pid = 'todolist_trigger_on_record_logical_delete',
NEW.last_action_code = 'LOGICAL_DELETE';
ELSE
SET NEW.update_timestamp = NOW(),
NEW.update_pid = 'todolist_trigger_on_record_update',
NEW.last_action_code = 'UPDATE';
END IF;
END;;
DELIMITER ;
SQL命令序列:
INSERT INTO todolist(to_do_item) VALUE ('Prepare for the assignment');
UPDATE todolist SET to_do_item = 'Check on how to start on the assignment' WHERE sequence_number = 1;
然后,发生了错误。
答案 0 :(得分:1)
您错过了OLD
触发器中NEW
周围的logical_delete_flag
或BEFORE UPDATE
关键字。要访问受触发器影响的行中的列,您需要根据您的方案使用其中一个关键字。
对于您,您应该使用OLD
围绕您正在测试的列为TRUE / FALSE。
DELIMITER ;;
CREATE TRIGGER todolist_trigger_on_record_update
BEFORE UPDATE ON todolist
FOR EACH ROW
BEGIN
IF (OLD.logical_delete_flag IS TRUE) THEN
SET NEW.delete_timestamp = NOW(),
NEW.delete_pid = 'todolist_trigger_on_record_logical_delete',
NEW.last_action_code = 'LOGICAL_DELETE';
ELSE
SET NEW.update_timestamp = NOW(),
NEW.update_pid = 'todolist_trigger_on_record_update',
NEW.last_action_code = 'UPDATE';
END IF;
END;;
DELIMITER ;