MariaDB sql 如果键存在则触发更新或如果键不存在则插入?
MariaDB sql trigger to update if key exists or insert if doesn't exist?
我是 SQL 的新手,但我正在尝试构建一个将在每次插入时执行的简单触发器。如果密钥已经存在,我希望它更新一些 table 值,或者如果它不存在,则用一些新值插入它。
以下是我尝试过的方法,但理想情况下我希望测试器成为被插入的东西。类似于 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
您想在不存在具有相同键的行时插入新行,并在存在时更新现有行,对吗?
您可能会发现使用 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', ...;
您的触发器方法的一个问题是,尝试从同一个 table 上的行触发器中查询 table 是不好的做法,因为它违反了 ACID 原则;许多 DBMS 根本不允许这样做,从而引发 "Mutating Table" 错误。从 insert row 触发器中更新一行会放大同样的问题。行触发器不应尝试直接访问其目标 table,而应仅通过 OLD
和 [=13= 间接访问触发行].
希望对您有所帮助。
我是 SQL 的新手,但我正在尝试构建一个将在每次插入时执行的简单触发器。如果密钥已经存在,我希望它更新一些 table 值,或者如果它不存在,则用一些新值插入它。
以下是我尝试过的方法,但理想情况下我希望测试器成为被插入的东西。类似于 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
您想在不存在具有相同键的行时插入新行,并在存在时更新现有行,对吗?
您可能会发现使用 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', ...;
您的触发器方法的一个问题是,尝试从同一个 table 上的行触发器中查询 table 是不好的做法,因为它违反了 ACID 原则;许多 DBMS 根本不允许这样做,从而引发 "Mutating Table" 错误。从 insert row 触发器中更新一行会放大同样的问题。行触发器不应尝试直接访问其目标 table,而应仅通过 OLD
和 [=13= 间接访问触发行].
希望对您有所帮助。