0

プロジェクトテーブル

proj_id, proj_name, Proj_Type
1, test, dev
2, test1, infra
3, test2, BI

クォータテーブル

quota_id, proj_id, allot_type, allot_num
1, 1, java, 3
2, 1, architect, 1
3, 1, Jasper, 2
4, 2, unix admin, 2
5, 2, dba, 1
6, 2, nwk admin, 1

追跡テーブル

track_id, proj_id, status,start_date, sch_end_date,end_date, update_date
1,1, started,dec 16 2012,feb 12 2013,,01 jan 2013
2,2, resource allocated, 01 jan 2013, 03 mar 2013, , 01 jan 2013
3,3, yet to start, 19 jan 2013, 19 apr 2013

宛先テーブル(Summary_Table)

event_id, proj_id, proj_name, Proj_Type, allot_type, allow_num, proj_start_date_sch_end_date, proj_status
1, 1, test,dev,java,3,16 dec 2012,12 feb 2013,started
2, 1, test,dev,architect,1,16 dec 2012, 12 feb 2013, started
3, 1, test,dev,jasper, 2, 16 dec 2012, 12 feb 2013, started

3つのソーステーブルすべてからの情報を宛先テーブルにロードするためのストアドプロシージャを作成する必要があります

プロジェクトのステータスが開始から配信に変更されたなど、ソーステーブルに変更があった場合は常に、宛先テーブルのレコードを定期的に更新する別の手順。

上記を達成するためのサンプル手順を教えてもらえますか?

4

1 に答える 1

0

宛先テーブルをロードします

  • ストアドプロシージャは1回だけ実行されます。つまり、宛先テーブルにデータを入力するだけですか。
  • または、3つのソーステーブルのいずれかに挿入するたびに、宛先テーブルにも挿入する必要がありますか?

    ロードするだけで、ストアドプロシージャを使用します

    INSERT INTO宛先([列])SELECT[列]FROMプロジェクトJOINクォータON...JOIN追跡ON.. ..

2番目の手順-ソーステーブルに変更がある場合は宛先テーブルを更新します。更新時にトリガーを使用することをお勧めします。

  • 宛先テーブルレコードを更新するソーステーブルの更新のトリガーを設定します(http://dev.mysql.com/doc/refman/5.0/en/triggers.html)

ソーステーブルの1つで挿入が発生するたびに宛先テーブルに入力する必要がある場合は、挿入と更新のトリガーを設定する必要があります。

dbと対話しているアプリケーションのように、挿入/更新がdbレベルでない場合は、宛先テーブルの更新を処理するようにストアドプロシージャを設定すると機能する場合があります。

テーブルスキーマといくつかのダミーデータを提供する場合は、サンプルコードを作成できます。

CREATE TABLE `project` (
  `proj_id` int(11) NOT NULL AUTO_INCREMENT,
  `proj_name` varchar(30) NOT NULL,
  `Proj_Type` varchar(30) NOT NULL,
  PRIMARY KEY (`proj_id`)
);

CREATE TABLE `quota` (
  `quota_id` int(11) NOT NULL AUTO_INCREMENT,
  `proj_id` int(11) NOT NULL,
  `allot_type` varchar(30) NOT NULL,
  `allot_num` INT(11) NOT NULL,
  PRIMARY KEY (`quota_id`)
);

CREATE TABLE `tracking` (
  `track_id` int(11) NOT NULL AUTO_INCREMENT,
  `proj_id` int(11) NOT NULL,
  `status` varchar(30) NOT NULL,
  `start_date` DATE NULL,
  `sch_end_date` DATE NULL,
  `end_date` DATE NULL,
  `update_date` DATE NULL,
  PRIMARY KEY (`track_id`)
);

CREATE TABLE `Destination` (
  `event_id` int(11) NOT NULL AUTO_INCREMENT,
  `proj_id` int(11) NOT NULL,
  `proj_name` varchar(30) NOT NULL,
  `Proj_Type` VARCHAR(30) NOT NULL,
  `allot_type` varchar(30) NOT NULL,
  `allot_num` INT(11) NOT NULL,
  `proj_start_date_sch_end_date` DATE NULL,
  `status` varchar(30) NOT NULL,
  PRIMARY KEY (`event_id`)
);


INSERT INTO `project` (`proj_id`, `proj_name`, `Proj_Type`) VALUES
(1, 'test', 'dev'),
(2, 'test1', 'infra'),
(3, 'test2', 'BI');

INSERT INTO `quota` (`quota_id`, `proj_id`, `allot_type`, `allot_num`) VALUES
(1, 1, 'java', 3),
(2, 1, 'architect', 1),
(3, 1, 'Jasper', 2),
(4, 2, 'unix admin', 2),
(5, 2, 'dba', 1),
(6, 2, 'nwk admin', 1);

INSERT INTO `tracking`(`track_id`, `proj_id`, `status`, `start_date`, `sch_end_date`, `end_date`, `update_date`) VALUES 
(1, 1, 'started', '2012-12-16', '2013-02-12', NULL, '2013-01-01'),
(2, 2, 'resource allocated', '2013-01-01', '2013-03-03', NULL, '2013-01-01'),
(3, 3, 'yet to start', '2013-01-19', '2013-04-19', NULL, NULL);


delimiter $
CREATE TRIGGER `uProjectChange` AFTER UPDATE ON project
FOR EACH ROW BEGIN

    UPDATE `test`.`Destination` AS d 
  INNER JOIN `test`.`project` AS p ON p.proj_id = d.proj_id 
  SET 
    d.proj_name = p.proj_name,
    d.Proj_Type = p.Proj_Type;

END;$
delimiter ;


-- Load destination table
INSERT INTO `Destination` (`proj_id`, `proj_name`, `Proj_Type`, `allot_type`, `allot_num`, `proj_start_date_sch_end_date`, `status`) 
SELECT 
    p.proj_id, p.proj_name, p.Proj_Type, 
    q.allot_type, q.allot_num,
    t.start_date, t.status
FROM 
    project p 
INNER JOIN quota q ON q.proj_id = p.proj_id 
INNER JOIN tracking t ON t.proj_id = q.proj_id;

-- UPDATE project SET  proj_name = 'test_test', Proj_Type = 'dev_test' WHERE proj_id = 1;
-- UPDATE project SET  proj_name = 'test', Proj_Type = 'dev' WHERE proj_id = 1;
SELECT * FROM `project`;
SELECT * FROM `Destination`;

http://sqlfiddle.com/#!8/43c77/1

これがサンプルコードです-しかし、私は質問があります-なぜ宛先テーブルを使用するのか、つまりテーブルを持っているのか、代わりにビューを使用しないのですか?

于 2013-01-24T07:00:22.427 に答える