本文主针对小白:如何在数据库有数据变动得时候及时得到内容。
MySQL触发器(Triggers)是一种数据库对象,它在指定的事件(例如插入、更新或删除数据)发生时自动执行一系列预定义的操作。触发器通常用于实施业务规则、数据完整性约束和自动化任务。
下面是MySQL触发器的一般语法:
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
FOR EACH ROW
trigger_body
其中:
-
trigger_name
是触发器的名称,你可以自定义。
-
BEFORE
或 AFTER
关键字表示触发器在指定事件之前或之后执行。
-
INSERT
、UPDATE
或 DELETE
关键字表示触发器与哪种操作相关联。
-
table_name
是触发器所在的表名。
-
FOR EACH ROW
表示触发器将为每个受影响的行执行。
-
trigger_body
是触发器的具体操作代码,可以包含一系列的SQL语句。
要查看已创建的触发器列表,可以使用以下命令:
SHOW TRIGGERS;
要删除触发器,可以使用以下语法:
DROP TRIGGER IF EXISTS trigger_name;
请注意,在MySQL中,触发器的使用可能受到特定版本和配置的限制。在创建和使用触发器之前,请确保你有足够的权限,并且了解数据库的配置和限制。
下面是一个示例,展示如何创建一个触发器,使得对表 testA
的 INSERT
、UPDATE
和 DELETE
操作能够同步到 testB
表:
-- 创建触发器,同步插入操作
CREATE TRIGGER sync_insert_testA_to_testB
AFTER INSERT ON testA
FOR EACH ROW
BEGIN
INSERT INTO testB (column1, column2, column3)
VALUES (NEW.column1, NEW.column2, NEW.column3);
END;
-- 创建触发器,同步更新操作
CREATE TRIGGER sync_update_testA_to_testB
AFTER UPDATE ON testA
FOR EACH ROW
BEGIN
UPDATE testB
SET column1 = NEW.column1, column2 = NEW.column2, column3 = NEW.column3
WHERE id = OLD.id;
END;
-- 创建触发器,同步删除操作
CREATE TRIGGER sync_delete_testA_to_testB
AFTER DELETE ON testA
FOR EACH ROW
BEGIN
DELETE FROM testB WHERE id = OLD.id;
END;
这个示例创建了三个触发器:
-
sync_insert_testA_to_testB
触发器在每次向 testA
表中插入新行后,将相应的数据插入到 testB
表中。
-
sync_update_testA_to_testB
触发器在每次更新 testA
表中的行后,将相应的数据更新到 testB
表中。
-
sync_delete_testA_to_testB
触发器在每次从 testA
表中删除行后,将相应的数据从 testB
表中删除。
请根据你的实际需求修改触发器的逻辑和字段映射。
NEW
和 OLD
是固定的关键字,用于引用触发器操作中的新数据和旧数据。
-
NEW
表示触发器操作中的新数据,通常用于插入和更新操作。你可以通过 NEW.column_name
的形式来引用 NEW
中的特定列。
-
OLD
表示触发器操作中的旧数据,通常用于更新和删除操作。你可以通过 OLD.column_name
的形式来引用 OLD
中的特定列。
这些关键字用于访问触发器操作所涉及的行的数据。NEW
包含新插入或更新的行的值,而 OLD
包含旧的被更新或删除的行的值。
之前提供的示例中,NEW.column1
是指 testA
表中插入或更新操作中的 column1
列的值。
请注意,使用 NEW
和 OLD
关键字时,你需要确保触发器与其所关联的表具有相同的列结构,否则可能会导致错误。
现阶段使用 JAVA / Springboot 还无法被动接收触发器处理的事件,代码层要获取,可引用示例,通过触发器,将表变动数据保留到临时表上,并在原有列字段基础上新增列信息提示,如 :
- data_type:数据类型:0-默认,1-插入,2-更新,3-删除 ,
- data_dispose:数据处理情况:0-未处理,1-已处理
然后定时读取数据(临时)表中新增且未处理的数据在代码业务中进行同步。
(一般使用场景是访问第三方数据库并需要将对方数据同步到本地库中,但触发器语句需要到对方库执行,所以权限比较重要)
上述采用新增列来记录新数据变化情况,而不考虑临时表的原有数据直接修改,主要从两个方面考虑:
1、新增的效率比修改的效率快,修改操作涉及到锁。
2、如果在临时表原有数据上变更,查询被编辑的列比较麻烦,而且删除操作还找不到数据了。
上次示例的删除操作可修改为:
-- 创建触发器,同步删除操作
CREATE TRIGGER sync_delete_testA_to_testB
AFTER DELETE ON testA
FOR EACH ROW
BEGIN
INSERT INTO testB (id , data_type, data_dispose, column3)
VALUES (OLD.id, 3, 0, NEW.column3);
END;