user13053989:
私はテーブルと呼ばれるEMPLOYEEを持って作成された新しいテーブルEMPLOYEE_SALARY_CHANGE(従業員の給与の変化を追跡するために)
ここでEMPLOYEE表であります
ID | Employee_Salary | Active
1 500 -> 700 1
2 600 1
3 2100 1
500-> 700手段はemployee_salaryは500から700に変更されます。
ここでEMPLOYEE_SALARY_CHANGEテーブルです
ID | Employee_Salary | Active
1 500 0
1 700 1
2 600 1
3 2100 1
従業員の給与が700に500から変更されたとき、私はEMPLOYEE_SALARY_CHANGEに新しい行を挿入する必要が
そして既存の1のアクティブ0に更新します。
IF (EMPLOYEE.EMPLOYEE_SALARY != EMPLOYEE_SALARY_CHANGE.EMPLOYEE_SALARY,
INSERT EMPLOYEE_SALARY_CHANGE INTO (EMPLOYEE.ID,EMPLOYEE.EMPLOYEE_SALARY,1) UNION
UPDATE EMPLOYEE_SALARY_CHANGE SET ACTIVE = 0 WHERE EMPLOYEE.EMPLOYEE_SALARY = EMPLOYEE_SALARY_CHANGE.EMPLOYEE_SALARY))
しかし、何かが間違っています。あなたはそれが使用PHPに優れているか、SQLで処理することができると思いますか?
P.Salmon:
通常は、アップサートを処理するためにトリガーを使用します。例えば
drop table if exists employee,employee_salary_change;
create table employee
(ID int, Employee_Salary int, Active int);
insert into employee values
(1 , 500 , 1),
(2 , 600 , 1),
(3 , 2100 , 1);
create table EMPLOYEE_SALARY_CHANGE(
ID int, Employee_Salary int, Active int);
insert into employee_salary_change values
(1 , 500 , 1),
(2 , 600 , 1),
(3 , 2100 , 1);
drop trigger if exists t;
delimiter $$
create trigger t after update on employee
for each row
begin
update employee_salary_change
set active = 0 where id = new.id;
insert into employee_salary_change values (new.id,new.employee_salary,new.active);
end $$
delimiter ;
update employee
set employee_salary = 700 where id = 1;
select * from employee;
+------+-----------------+--------+
| ID | Employee_Salary | Active |
+------+-----------------+--------+
| 1 | 700 | 1 |
| 2 | 600 | 1 |
| 3 | 2100 | 1 |
+------+-----------------+--------+
select * from employee_salary_change;
+------+-----------------+--------+
| ID | Employee_Salary | Active |
+------+-----------------+--------+
| 1 | 500 | 0 |
| 2 | 600 | 1 |
| 3 | 2100 | 1 |
| 1 | 700 | 1 |
+------+-----------------+--------+
私は同じ給料が既に存在するかどうかを確認するためにテストしていませんので、ごemployee_salary_changeテーブルは、質問の目的のために簡略化されていると仮定します。