2016-05-01 7 views
2

ここは私のクエリです。 compare_moodleを同期させることができる方法INSERT INTOクエリでデータベースを同期する方法

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または別のデータベース変更(削除/更新/挿入)?私はトリガーを使用すると思うが、どのように知りません。

+0

この部分は私にとってはかなり混乱しています。* mdl_userまたは別のデータベースが変更されたとき*。あなたは他のテーブルを意味しますか? 'mdl_course'テーブルが変更されたときに' compare_moodle'の値を同期させたい例 –

+0

上記のクエリがcompare_moodleデータの唯一のソースであれば、代わりにこのテーブルをドロップしてcompare_moodleビューを作成してください。 – Serg

+0

私の平均は、データベースcompare_moodleが作成された後です。mdl_courseでコースを削除したり、mdl_userでユーザーを削除すると、データベースcompare_moodleが変更されます。 (ユーザー/コースが少ない) –

答えて

2

あなたの目的のためにテーブルの代わりにVIEWを使用することは可能です。

これは、ソーステーブルと常にトランザクション的に最新の仮想テーブルを提供します。 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しかし、このアプローチは、通常のビューを使用するのと比較して、大変な面倒で、メンテナンスの頭痛です。