回答編集履歴

3

調整

2018/10/19 02:35

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -141,3 +141,9 @@
141
141
  ```
142
142
 
143
143
  結果:sもusにも追加されない
144
+
145
+
146
+
147
+ - その他
148
+
149
+ uidに存在しないデータを投入するときもsにはデータが投入されない

2

調整

2018/10/19 02:35

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -70,7 +70,17 @@
70
70
 
71
71
  start transaction;
72
72
 
73
- set @sval=sval,@uid=uid;
73
+ set @sval=sval,@uid=uid,@ucount=0;
74
+
75
+ set @sql=concat("select count(*) into @ucount from user where `uid`=@uid");
76
+
77
+ prepare stmt from @sql;
78
+
79
+ execute stmt;
80
+
81
+ select @ucount;
82
+
83
+ if @ucount>0 then
74
84
 
75
85
  insert ignore into schedule(`sval`) values(@sval);
76
86
 
@@ -82,6 +92,8 @@
82
92
 
83
93
  insert ignore into schedule_user(`sid`,`uid`) values(@sid,@uid);
84
94
 
95
+ end if ;
96
+
85
97
  commit;
86
98
 
87
99
  end
@@ -89,6 +101,8 @@
89
101
  //
90
102
 
91
103
  delimiter ;
104
+
105
+
92
106
 
93
107
  ```
94
108
 

1

まとめ

2018/10/19 02:21

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -4,8 +4,126 @@
4
4
 
5
5
  ちょっと意味不明
6
6
 
7
- user_scheduleテーブル(以下us)はschedule(以下s)テーブルとuserテーブルの
7
+ user_scheduleテーブル(以下us)はschedule(s)テーブルとuser(同u)テーブルの
8
8
 
9
9
  橋渡しですから、sにデータが登録されてもusには影響はありません
10
10
 
11
11
  逆にsのデータが削除されたときはusに不整合が発生するので削除する必要はあるかもしれません。
12
+
13
+
14
+
15
+ # まとめ
16
+
17
+ ```SQL
18
+
19
+ create table user (uid int primary key,uval varchar(10));
20
+
21
+
22
+
23
+ create table schedule (sid int primary key auto_increment,sval varchar(10) unique key);
24
+
25
+
26
+
27
+ create table schedule_user (
28
+
29
+ usid int primary key auto_increment,
30
+
31
+ sid int not null ,
32
+
33
+ foreign key(sid) references schedule(sid) on delete cascade,
34
+
35
+ uid int not null,
36
+
37
+ foreign key(uid) references user(uid) on delete cascade,
38
+
39
+ unique key us0(sid,uid));
40
+
41
+
42
+
43
+ ```
44
+
45
+ - サンプルデータ
46
+
47
+ ```SQL
48
+
49
+ insert into user values(101,'X'),(102,'Y'),(103,'Z');
50
+
51
+ insert into schedule(sval) values('A'),('B'),('C');
52
+
53
+ insert into schedule_user(sid,uid) values(1,101),(2,101),(1,102),(2,103),(3,102);
54
+
55
+
56
+
57
+ ```
58
+
59
+ - purocedure作成
60
+
61
+ ```SQL
62
+
63
+ drop procedure if exists s2us_sval_uid;
64
+
65
+ delimiter //
66
+
67
+ create procedure s2us_sval_uid(in sval varchar(10),in uid int)
68
+
69
+ begin
70
+
71
+ start transaction;
72
+
73
+ set @sval=sval,@uid=uid;
74
+
75
+ insert ignore into schedule(`sval`) values(@sval);
76
+
77
+ set @sql=concat("select sid into @sid from schedule where `sval`=@sval");
78
+
79
+ prepare stmt from @sql;
80
+
81
+ execute stmt;
82
+
83
+ insert ignore into schedule_user(`sid`,`uid`) values(@sid,@uid);
84
+
85
+ commit;
86
+
87
+ end
88
+
89
+ //
90
+
91
+ delimiter ;
92
+
93
+ ```
94
+
95
+
96
+
97
+ - 新規スケジュール"D"とuid:102を追加
98
+
99
+ ```SQL
100
+
101
+ call s2us_sval_uid('D',102);
102
+
103
+ ```
104
+
105
+ 結果:sにDが追加され、usに4,102が追加
106
+
107
+
108
+
109
+ - 既存スケジュール"D"とuid:103を追加
110
+
111
+ ```SQL
112
+
113
+ call s2us_sval_uid('D',103);
114
+
115
+ ```
116
+
117
+ 結果:sには追加されないが、usに4,103が追加
118
+
119
+
120
+
121
+ - 既存スケジュール"D"とusにすでに存在するuid:102を追加
122
+
123
+ ```SQL
124
+
125
+ call s2us_sval_uid('D',102);
126
+
127
+ ```
128
+
129
+ 結果:sもusにも追加されない