宛先テーブルをロードします
- ストアドプロシージャは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
これがサンプルコードです-しかし、私は質問があります-なぜ宛先テーブルを使用するのか、つまりテーブルを持っているのか、代わりにビューを使用しないのですか?