我是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
答案 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
间接访问触发行。
希望有所帮助。