回答編集履歴

1

追記

2016/10/14 00:22

投稿

yambejp
yambejp

スコア114878

test CHANGED
@@ -5,3 +5,75 @@
5
5
  データ投入後規定値をオーバーしていたらデータ削除
6
6
 
7
7
  されるようにすればいいでしょう
8
+
9
+
10
+
11
+ # 追記
12
+
13
+ 普通にプロシージャでトランザクション処理すればよいような気もしますが
14
+
15
+ - テーブル作成とテーブルBに基本データ投入
16
+
17
+ ```SQL
18
+
19
+ create table tbl_a(id int not null primary key auto_increment,no int,dt datetime,hit tinyint);
20
+
21
+ create table tbl_b(no int not null primary key,max int,hit int,dt datetime);
22
+
23
+ insert into tbl_b values(1,3,0,0),(2,10,0,0),(3,10,0,0);
24
+
25
+ ```
26
+
27
+ - プロシージャ作成
28
+
29
+ ```ここに言語を入力
30
+
31
+ DROP PROCEDURE IF EXISTS ADD_TBL_A;
32
+
33
+ DELIMITER //
34
+
35
+ CREATE PROCEDURE ADD_TBL_A(IN a INT)
36
+
37
+ BEGIN
38
+
39
+ START TRANSACTION;
40
+
41
+ SET @now:=NOW();
42
+
43
+ INSERT INTO tbl_a SET no=a,dt=@now,hit=1;
44
+
45
+ SET @a:=(SELECT max FROM tbl_b WHERE no=a);
46
+
47
+ SET @b:=(SELECT COUNT(*) FROM tbl_a WHERE no=a);
48
+
49
+ IF @a<@b THEN
50
+
51
+ ROLLBACK;
52
+
53
+ ELSE
54
+
55
+ UPDATE tbl_b SET hit=@b,dt=@now WHERE no=a;
56
+
57
+ COMMIT;
58
+
59
+ END IF;
60
+
61
+ END
62
+
63
+ //
64
+
65
+ DELIMITER ;
66
+
67
+ ```
68
+
69
+ - データ投入
70
+
71
+ ```SQL
72
+
73
+ call ADD_TBL_A(1);
74
+
75
+ ```
76
+
77
+ - 上記例では1を3回投入するとtbl_bの制約に引っかかってrollbackされる
78
+
79
+ - tbl_bを更新するのと同様にtbl_cがあれば合わせて更新すればOK