2017-04-06 83 views
0

我一直在试图想出一个优雅的方式来做到以下几点,让我们说,我有以下表格:MySQL的更新当前记录表

+-----+---------+------------+--------------+------------+------------+--------+ 
| ID | EmpNum | Name | Title  | StartDate | UpdateDate | IsCurr | 
+-----+---------+------------+--------------+------------+------------+--------+ 
| 1 | 0000001 | John Smith | Engineer  | 01/01/2017 | 01/02/2017 | N  | 
| 2 | 0000001 | John Smith | Sr. Engineer | 01/01/2017 | NULL  | Y  | 
+-----+---------+------------+--------------+------------+------------+--------+ 

当员工改变标题,我要更新当前员工记录的UpdateDate,并将IsCurr更改为N,然后插入将成为当前记录的新记录。例如,如果员工John Smith在01/03/2017被提升为团队领导,那么结果表就会这样。

+ ----- + --------- + ------------ + -------------- + - ----------- + ------------ + ----

----+ 
| ID | EmpNum | Name | Title  | StartDate | UpdateDate | IsCurr | 
+-----+---------+------------+--------------+------------+------------+--------+ 
| 1 | 0000001 | John Smith | Engineer  | 01/01/2017 | 01/02/2017 | N  | 
| 2 | 0000001 | John Smith | Sr. Engineer | 01/01/2017 | 01/03/2017 | N  | 
| 3 | 0000001 | John Smith | Team Lead | 01/01/2017 | NULL  | Y  | 
+-----+---------+------------+--------------+------------+------------+--------+ 

从我可以告诉MySQL没有MERGE函数,所以我将需要在2个单独的命令。如UPDATE中最新的记录,然后插入新行。 在MySQL中有更好的方法吗?

在此先感谢。

回答

1

您可以尝试使用INSERT INTO ... ON DUPLICATE KEY安排您想要的查询。但是你需要ID作为索引。 从MySQL版本5.5开始可用。

INSERT INTO table (ID, EmpNum, Name, Title, StartDate, UpdateDate, IsCurr) 
VALUES 
(3, '0000001', 'John Smith', 'Team Lead', '01/01/2017', NULL, 'Y'), 
(2, '0000001', 'John Smith', 'Sr. Engineer', '01/01/2017', '01/03/2017', 'N') 
ON DUPLICATE KEY UPDATE isCurr='N', UpdateDate='01/03/2017'; 
+0

我确实考虑过'对重复KEY'但我插入一个完全新的记录到该表中,所以我需要通过一些其他的领域,以验证的同一员工的先前记录的存在。 – Alistair

+0

不确定是否过度使用,但如果使用子查询来选择最近的记录并在INSERT INTO的VALUES中使用它可能会起作用。 – Dez