2017-04-06 2 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  | 
+-----+---------+------------+--------------+------------+------------+--------+ 

従業員の変化のタイトル現従業員レコードのを更新し、IsCurrNに変更して、現在の従業員レコードになる新しいレコードを挿入します。たとえば、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

私はDUPLICATE KEY' ON 'を検討しましたが、私はそのテーブルに完全に新しいレコードを挿入していますので、私はいくつかの他のフィールドを経由して同じ従業員の前のレコードの存在を確認する必要があります。 – Alistair

+0

あまりにも頭がおかしいのかどうかはわかりませんが、サブクエリを使用して最新のレコードをSELECTし、INSERT INTOのVALUESの内部で使用するとうまくいく可能性があります。 – Dez

関連する問題