这是我的查询。
INSERT INTO compare_moodle
(userid,
username,
firstname,
lastname,
courseid,
coursename)
SELECT mdl_user.id,
mdl_user.username,
mdl_user.firstname,
mdl_user.lastname,
mdl_course.id,
mdl_course.fullname
FROM mdl_user
JOIN mdl_role_assignments ra
ON mdl_user.id = ra.userid
JOIN mdl_role r
ON ra.roleid = r.id
AND r.id = 5
JOIN mdl_context c
ON ra.contextid = c.id
JOIN mdl_course
ON mdl_course.id = c.instanceid
当mdl_user
或其他数据库更改(删除/更新/插入)时,compare_moodle
如何同步?我认为使用触发但不知道如何。
答案 0 :(得分:2)
为了达到目的,可以使用VIEW
代替表格。你这样做是这样的:
CREATE OR REPLACE VIEW compare_moodle AS
SELECT mdl_user.id AS userid,
mdl_user.username,
mdl_user.firstname,
mdl_user.lastname,
mdl_course.id AS courseid,
mdl_course.fullname AS coursename
FROM mdl_user
JOIN mdl_role_assignments ra ON mdl_user.id = ra.userid
JOIN mdl_role r ON ra.roleid = r.id
AND r.id = 5
JOIN mdl_context c ON ra.contextid = c.id
JOIN mdl_course ON mdl_course.id = c.instanceid;
这为您提供了一个虚拟表,该表始终与您的源表在事务上保持同步。 SQL最佳实践告诉我们,这种方法没有数据冗余,是实现您想要的最佳方法。
问题当然是表现。如果您经常使用此compare_moodle
视图,则可能会减慢速度。正确索引表格可以实际消除这些减速。我建议你让你的应用程序使用视图,然后弄清楚你是否有性能问题。
您在问题中要求的是所谓的materialized view - 由实际表格表示的视图。在DBMS的某些品牌和型号中,您可以提供类似CREATE OR REPLACE MATERIALIZED VIEW ...
的命令,DBMS可以完成所有工作。但是,MySQL不提供这一点。
管理物化视图有各种MySQL方法。浏览此处获取更多信息。 https://dba.stackexchange.com/questions/86790/best-way-to-create-a-materialized-view-in-mysql但与使用普通视图相比,这种方法是一个很大的麻烦和维护问题。