如果密钥存在则更新MariaDB sql触发器,如果​​不存在则插入?

时间:2016-05-28 23:57:32

标签: mysql triggers mariadb

我是SQL新手,但尝试构建一个将在每次插入时执行的简单触发器。如果密钥已经存在,我希望它更新一些表值,或者如果它不存在则插入一些新值。

以下是我的尝试,但理想情况下我希望测试仪成为插入的东西。像NEW.reference_key这样的东西?

CREATE TRIGGER key_access_monitor 
BEFORE INSERT ON individual_key_log 
FOR EACH ROW 
BEGIN
    IF EXISTS (SELECT reference_key FROM individual_key_log WHERE key = 'tester')
        SELECT 'Found it!'
    ELSE
    SELECT 'Cannot find it!'
   END IF
END

1 个答案:

答案 0 :(得分:0)

如果具有相同键的行尚不存在,则要插入新行,如果现有行存在,则更新现有行,是否正确?

您可能会发现使用INSERT ... ON DUPLICATE KEY UPDATE更容易,如下所示:

INSERT INTO individual_key_log
    (key, col1, col2, col3, ...)
  VALUES
    ('tester', 'val1', 'val2', 'val3', ...)
  ON DUPLICATE KEY UPDATE
    SET col1 = 'val1', col2 = 'val2', col3 = 'val3', ...;

触发器方法的一个问题是,尝试从同一个表中的行触发器内查询表是不好的做法,因为它违反了ACID原则;许多DBMS根本不允许它,引发“变异表”错误。从插入行触发器中更新行会放大相同的问题。行触发器永远不应该尝试直接访问其目标表,而是通过 OLD NEW 间接访问触发行。

希望有所帮助。