错误代码:1054。未知列' logical_delete_flag'在' field_list'

时间:2016-06-05 07:22:55

标签: mysql

虽然这里有很多类似于我现在遇到的问题,但我尝试的答案都没有用。鉴于以下表格和触发器脚本,为什么会遇到标题主题的原因和解决方法是什么。

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;

然后,发生了错误。

1 个答案:

答案 0 :(得分:1)

您错过了OLD触发器中NEW周围的logical_delete_flagBEFORE 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 ;