SQL Query以更新具有时间依赖性的表

时间:2015-01-06 22:32:40

标签: mysql wamp

我正在为我的应用程序运行带有VBA接口的WAMP设置。该应用程序通过基于时间的关系定义“员工”及其与“组织”的关系。


我遇到了一个有效的方法来更新我的数据库中的表,我遇到了麻烦。有3个表格定义:员工,组织以及员工之间的关系以及该组织的就业开始/结束日期。当跨越一段时间的条目需要拆分时,问题就出现了:即最初定义条目的条目与该组织合作1年的员工在本年度内分离,因为该员工在另一家公司工作1个月。

我用以下庄园构建了我的桌子:

tbl_employee

+----+-----------+----------+
| id | firstname | lastname |
+----+-----------+----------+
|  1 | jordan    | bean     |
|  2 | kevin     | sams     |
+----+-----------+----------+

tbl_organisation

+----+----------+
| id |   name   |
+----+----------+
|  1 | nanosoft |
|  2 | attic Gm |
+----+----------+

tbl_relation_employee_organisation

+----+-------------+-----------------+------------+------------+
| id | employee_id | organisation_id | validfrom  |  validto   |
+----+-------------+-----------------+------------+------------+
|  1 |           1 |               1 | 2015-01-01 | 2016-01-01 |
+----+-------------+-----------------+------------+------------+


现在我面临的问题是更新tbl_relation_employee_organisation表,以便员工可以在现有的extry之间更改组织,即员工1是否与 2015-10-01 2015-11-01

(也许我的问题需要修改我的表结构:将员工与仅发生更改的日期的组织联系起来?)


我可以在此结构上运行什么查询来“拆分”以下mannor中的关系表上的行

+----+-------------+-----------------+------------+------------+
| id | employee_id | organisation_id | validfrom  |  validto   |
+----+-------------+-----------------+------------+------------+
|  1 |           1 |               1 | 2015-01-01 | 2015-09-30 |
|  2 |           1 |               2 | 2015-10-01 | 2016-11-01 |
|  3 |           1 |               1 | 2015-11-02 | 2016-01-01 |
+----+-------------+-----------------+------------+------------+

1 个答案:

答案 0 :(得分:0)

问:我可以在此结构上运行什么查询来“拆分”关系表上的行。

A:根据提供的信息,“拆分”需要两个查询,现有行的UPDATE以及用于添加两个新行的INSERT。例如:

UPDATE tbl_relation_employee_organisation t 
   SET t.validto = '2015-09-30'
 WHERE t.id = 1

INSERT INTO tbl_relation_employee_organization 
(id, employee_id, organisation_id, validfrom, validto)
VALUES (2, 1, 2, '2015-10-01','2015-11-01')
     , (3, 1, 1, '2015-11-02','2016-01-01')

这将是“分割”行的最有效(就数据库性能而言)。


<强>后续

要在单个语句中执行此操作,如果id列上存在UNIQUE(或PRIMARY KEY)约束...

INSERT INTO tbl_relation_employee_organization 
(id, employee_id, organisation_id, validfrom, validto)
VALUES (1, 1, 1, '2015-01-01','2015-09-30')
     , (2, 1, 2, '2015-10-01','2015-11-01')
     , (3, 1, 1, '2015-11-02','2016-01-01')
ON DUPLICATE KEY
UPDATE employee_id     = VALUES(employee_id)
     , organisation_id = VALUES(organisation_id)
     , validfrom       = VALUES(validfrom)
     , validto         = VALUES(validto)

请注意,您至少需要提供要更新的行的id值;如果idAUTO_INCREMENT,则可以将NULL替换为第二行和第三行的id值。

或者,如果(employee_id,validfrom)上有UNIQUE约束,则可以省略id值,并允许通过这两列的值引发DUPLICATE KEY异常,并获取更新已执行操作,无需提供id值。 (使用此方法,尝试INSERT重复行将使用auto_increment值;即使未插入行,该值也会消耗,因为MySQL执行操作的顺序(DUPLICATE KEY异常)在尝试插入之前不会抛出,并且在尝试执行插入时检索/递增auto_increment值。)