回答編集履歴

1

sample

2017/04/13 03:37

投稿

yambejp
yambejp

スコア114883

test CHANGED
@@ -17,3 +17,81 @@
17
17
  $_REQUESTを投入しないし、影響があればUPDATEされるのだから
18
18
 
19
19
  単にUPDATE文を1回発行するだけで良い話のような気がします
20
+
21
+
22
+
23
+ # trigger sample
24
+
25
+ データ用テーブルAと履歴用テーブルB
26
+
27
+ テーブルAのaidは主キーだが履歴を取る場合Bの主キーにはナリえないのでBに新たに
28
+
29
+ 主キーbidを設定し、更新された日時も別途保存することとする
30
+
31
+ ```SQL
32
+
33
+ create table tblA(aid int primary key,val1 int,val2 int,val3 int);
34
+
35
+ create table tblB(bid int primary key auto_increment,aid int ,val1 int,val2 int,val3 int,modified datetime);
36
+
37
+ ```
38
+
39
+ トリガー作成
40
+
41
+ ```SQL
42
+
43
+ drop trigger if exists a_to_b;
44
+
45
+ delimiter //
46
+
47
+ create trigger a_to_b after update on `tblA`
48
+
49
+ for each row begin
50
+
51
+ insert into tblB SET aid=old.aid,val1=old.val1,val2=old.val2,val3=old.val3,modified=now();
52
+
53
+ end;
54
+
55
+ //
56
+
57
+ delimiter ;
58
+
59
+ ```
60
+
61
+ (1)データ投入
62
+
63
+ ```SQL
64
+
65
+ insert into tblA values(1,101,201,301),(2,102,202,302),(3,103,203,303);
66
+
67
+ ```
68
+
69
+ tblAにはデータが新規投入されるが、tblBには投入されない
70
+
71
+
72
+
73
+ (2)更新データを投入
74
+
75
+ ```SQL
76
+
77
+ insert into tblA values(2,112,212,312),(4,104,204,304) on duplicate key update val1=values(val1),val2=values(val2),val3=values(val3);
78
+
79
+ ```
80
+
81
+ id=2は更新されるのでtblBに古いデータが投入される、id=4は新規なので無視
82
+
83
+
84
+
85
+ (3)更新データを投入
86
+
87
+ ```SQL
88
+
89
+ insert into tblA values(2,122,222,322),(4,104,204,304) on duplicate key update val1=values(val1),val2=values(val2),val3=values(val3);
90
+
91
+ ```
92
+
93
+ id=2は更新されるのでtblBに古いデータが投入される
94
+
95
+ (tblBのidはダブっているのが確認できる)
96
+
97
+ id=4は全てのvalが元のデータと一緒なので更新がかからないので無視