使用MySQL存储过程我想将记录插入到其他三个表的表中

时间:2013-01-24 06:36:40

标签: mysql stored-procedures

项目表

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

我必须编写一个存储过程来加载目标表,其中包含来自所有三个源表的信息

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

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

1 个答案:

答案 0 :(得分:0)

加载目的地表

  • 商店程序只运行一次 - 即只填充目的地表?
  • 或者,对于三个源中的任何一个,每个插入表都必须在目标表中插入吗?

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

    INSERT INTO desitination([columns]) SELECT [列] 来自项目 加入配额ON ... 加入跟踪ON ...

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

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

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

如果插入/更新不在数据库级别,就像您有任何与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

以下是示例代码 - 但我确实有一个问题 - 为什么使用目标表,即有一个表,为什么不使用视图?

相关问题