如何创建触发器以验证另一个表上是否存在新数据?

时间:2019-12-27 16:17:18

标签: mysql

我正在尝试创建触发器以将新数据插入到项目表中,但是必须检查项目表中是否存在新数据。这是我的代码:

DELIMITER //

CREATE TRIGGER addItem
AFTER INSERT ON tempitem FOR EACH ROW
BEGIN
    IF NOT EXISTS (SELECT * FROM item WHERE item_name = NEW.item_name) THEN
    BEGIN
        INSERT INTO item (item_code, item_name, kategori, satuan)
        SELECT item_code, item_name, kategori, satuan FROM tempitem WHERE tempitem.item_name = NEW.item_name ;
    END IF;
END;

//

DELIMITER ;

该错误表明“ IF; END;”附近存在语法错误。在第8行中,但是我在语法上找不到任何错误。

2 个答案:

答案 0 :(得分:2)

使用SQL时,我们不会检查数据是否存在,以确保不会添加重复项。我们尝试将其插入,并放置唯一约束。如果记录存在,数据库会告诉我们“不不不,它已经在那里” 就是这样。

解决问题的方法不是触发器,它是在unique上放置一个item_name索引。由于item_name可能是 文本列(char,varchar,text),因此通常的技术是创建一个附加列,其中将包含{{1 }},然后将唯一索引应用于该索引。

剩下的就是利用MySQL的一种SQL扩展,即item_name语法或INSERT IGNORE,您的问题将永远得到解决。

答案 1 :(得分:0)

第7行中的“ THEN”之后有一个额外的“ BEGIN”,这可能是导致问题的原因。

尝试

DELIMITER //

CREATE TRIGGER addItem
AFTER INSERT ON tempitem FOR EACH ROW
BEGIN
    IF NOT EXISTS (SELECT * FROM item WHERE item_name = NEW.item_name) THEN
        INSERT INTO item (item_code, item_name, kategori, satuan)
        SELECT item_code, item_name, kategori, satuan FROM tempitem WHERE tempitem.item_name = NEW.item_name ;
    END IF;
END;

//

DELIMITER ;