Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

这是一个有关于MySQL数据库实际应用中的总结。

1、触发器

触发器–解决新建后各表不同步的问题

2024年3月31日,在写项目时,弄创建组织模块过程中,发现:用户在创建组织后,页面不显示当前用户刚创建的组织。刷新无效。

知识点:触发器

1
2
3
4
5
6
7
8
9
10
CREATE TRIGGER after_orgInfo_insert
--定义触发器名称为:after_orgInfo_inser,在新建组织后,添加成员
AFTER INSERT ON organization_info
FOR EACH ROW
BEGIN
-- 插入创建者到团队成员表
INSERT INTO organization_members (org_id, member_id)
VALUES (NEW.org_id, NEW.org_principal_id);
--此处依据你表中的数据,进行插入即可
END;

点击并拖拽以移动

(1)初步定位:数据库数据不同步。

打开数据库,果然发现,在创建组织后,组织成员表中并未同步改创建者的信息。

img点击并拖拽以移动编辑

img点击并拖拽以移动编辑

(2)问题根源:突然意识到,在设计初未完善触发器的设计,应当在新建组织后,成员表中自动加入创建者。

(3)解决办法:随即补上:运行以下sql语句

1
2
3
4
5
6
7
8
CREATE TRIGGER after_orgInfo_insert
AFTER INSERT ON organization_info
FOR EACH ROW
BEGIN
-- 插入创建者到团队成员表
INSERT INTO organization_members (org_id, member_id)
VALUES (NEW.org_id, NEW.org_principal_id);
END;

2、事件

数据库中一些有关于时间的数据,需要动态调整,但从代码角度未免比较麻烦,不如直接从数据层面进行设置:推荐使用 事件

(1)碎碎念:

2024年5月29日,在写项目时,偶然发现部分数据需要依据时间实现状态同步。比如活动当前的状态,

img点击并拖拽以移动

2、解决思路:

(1)触发器:不推荐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TRIGGER update_activity_status -- 触发器名称
BEFORE UPDATE ON activity_info -- 所在表格
FOR EACH ROW
BEGIN
IF NEW.act_statue <> 4 THEN -- 只有当 act_status 不为 4 时才进行后续判断
-- act_statue 为我数据库中的属性
IF NEW.act_start_time > CURRENT_TIMESTAMP THEN
SET NEW.act_statue = 1; -- 未开始
ELSEIF NEW.act_end_time < CURRENT_TIMESTAMP THEN
SET NEW.act_statue = 3; -- 已结束
ELSE
SET NEW.act_statue = 2; -- 进行中
END IF;
END IF;
END;

点击并拖拽以移动

但,这个只能在更新的时候才能生效,我希望是按一定时间来自动更新

(2)事件:推荐。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE EVENT update_activity_status_daily  
ON SCHEDULE EVERY 1 DAY -- 设置发生的间隔周期
STARTS CURRENT_TIMESTAMP -- 当前时间
DO
BEGIN
UPDATE activity_info
SET act_statue =
CASE
WHEN act_statue IN (1, 2, 3) THEN
CASE
WHEN act_start_time > CURRENT_TIMESTAMP THEN 1 -- 未开始
WHEN act_end_time < CURRENT_TIMESTAMP THEN 3 -- 已结束
ELSE 2 -- 进行中
END
ELSE act_statue -- 保持不变
END;
END;

点击并拖拽以移动

默认一天后,自动变化,设置后立即生效,如下图:
img点击并拖拽以移动​编辑

事件在navicate中的位置:

img点击并拖拽以移动

双击可对该事件进行触发时间等的调整。

评论