我正在为我的应用程序运行带有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 |
+----+-------------+-----------------+------------+------------+
答案 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
值;如果id
为AUTO_INCREMENT
,则可以将NULL
替换为第二行和第三行的id
值。
或者,如果(employee_id,validfrom)
上有UNIQUE约束,则可以省略id
值,并允许通过这两列的值引发DUPLICATE KEY异常,并获取更新已执行操作,无需提供id
值。 (使用此方法,尝试INSERT
重复行将使用auto_increment值;即使未插入行,该值也会消耗,因为MySQL执行操作的顺序(DUPLICATE KEY异常)在尝试插入之前不会抛出,并且在尝试执行插入时检索/递增auto_increment值。)