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

我必须编写一个存储过程来使用来自所有三个源表的信息加载目标表

另一个过程是在源表发生变化时定期更新目标表中的记录,例如项目状态从已开始更改为已交付等。

有人可以给我一些示例程序来实现上述要求。

4

1 回答 1

0

加载目标表

  • 存储过程将只运行一次 - 即只是为了填充目标表?
  • 或者对于三个源表中的任何一个中的每个插入都必须在目标表中插入?

    仅用于加载仅使用存储过程

    INSERT INTO desitination ([columns]) SELECT [columns] FROM project JOIN quota ON ... JOIN tracking ON ...

对于您的第二个过程-如果源表有任何更改,则更新目标表,我建议在更新时使用触发器,即

  • 为更新目标表记录的源表设置触发器(http://dev.mysql.com/doc/refman/5.0/en/triggers.html)

如果每次在源表之一中发生插入时都必须填充目标表,则必须为插入和更新设置触发器。

如果插入/更新不在数据库级别,就像您有任何与数据库交互的应用程序一样,那么设置存储过程来处理目标表上的更新可能会起作用。

如果您将提供表格架构和一些虚拟数据,我可以创建一个示例代码。

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 回答