如何在INSERT INTO查询中同步数据库

时间:2016-05-01 11:20:16

标签: mysql sql triggers insert

这是我的查询。

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如何同步?我认为使用触发但不知道如何。

1 个答案:

答案 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但与使用普通视图相比,这种方法是一个很大的麻烦和维护问题。