teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

調整

2018/10/19 02:35

投稿

yambejp
yambejp

スコア117946

answer CHANGED
@@ -69,4 +69,7 @@
69
69
  ```SQL
70
70
  call s2us_sval_uid('D',102);
71
71
  ```
72
- 結果:sもusにも追加されない
72
+ 結果:sもusにも追加されない
73
+
74
+ - その他
75
+ uidに存在しないデータを投入するときもsにはデータが投入されない

2

調整

2018/10/19 02:35

投稿

yambejp
yambejp

スコア117946

answer CHANGED
@@ -34,16 +34,23 @@
34
34
  create procedure s2us_sval_uid(in sval varchar(10),in uid int)
35
35
  begin
36
36
  start transaction;
37
- set @sval=sval,@uid=uid;
37
+ set @sval=sval,@uid=uid,@ucount=0;
38
+ set @sql=concat("select count(*) into @ucount from user where `uid`=@uid");
39
+ prepare stmt from @sql;
40
+ execute stmt;
41
+ select @ucount;
42
+ if @ucount>0 then
38
43
  insert ignore into schedule(`sval`) values(@sval);
39
44
  set @sql=concat("select sid into @sid from schedule where `sval`=@sval");
40
45
  prepare stmt from @sql;
41
46
  execute stmt;
42
47
  insert ignore into schedule_user(`sid`,`uid`) values(@sid,@uid);
48
+ end if ;
43
49
  commit;
44
50
  end
45
51
  //
46
52
  delimiter ;
53
+
47
54
  ```
48
55
 
49
56
  - 新規スケジュール"D"とuid:102を追加

1

まとめ

2018/10/19 02:21

投稿

yambejp
yambejp

スコア117946

answer CHANGED
@@ -1,6 +1,65 @@
1
1
  > ここでscheduleをフォームから登録すると同時にuser_scheduleのschedule_idにも登録したい
2
2
 
3
3
  ちょっと意味不明
4
- user_scheduleテーブル(以下us)はschedule(以下s)テーブルとuserテーブルの
4
+ user_scheduleテーブル(以下us)はschedule(s)テーブルとuser(同u)テーブルの
5
5
  橋渡しですから、sにデータが登録されてもusには影響はありません
6
- 逆にsのデータが削除されたときはusに不整合が発生するので削除する必要はあるかもしれません。
6
+ 逆にsのデータが削除されたときはusに不整合が発生するので削除する必要はあるかもしれません。
7
+
8
+ # まとめ
9
+ ```SQL
10
+ create table user (uid int primary key,uval varchar(10));
11
+
12
+ create table schedule (sid int primary key auto_increment,sval varchar(10) unique key);
13
+
14
+ create table schedule_user (
15
+ usid int primary key auto_increment,
16
+ sid int not null ,
17
+ foreign key(sid) references schedule(sid) on delete cascade,
18
+ uid int not null,
19
+ foreign key(uid) references user(uid) on delete cascade,
20
+ unique key us0(sid,uid));
21
+
22
+ ```
23
+ - サンプルデータ
24
+ ```SQL
25
+ insert into user values(101,'X'),(102,'Y'),(103,'Z');
26
+ insert into schedule(sval) values('A'),('B'),('C');
27
+ insert into schedule_user(sid,uid) values(1,101),(2,101),(1,102),(2,103),(3,102);
28
+
29
+ ```
30
+ - purocedure作成
31
+ ```SQL
32
+ drop procedure if exists s2us_sval_uid;
33
+ delimiter //
34
+ create procedure s2us_sval_uid(in sval varchar(10),in uid int)
35
+ begin
36
+ start transaction;
37
+ set @sval=sval,@uid=uid;
38
+ insert ignore into schedule(`sval`) values(@sval);
39
+ set @sql=concat("select sid into @sid from schedule where `sval`=@sval");
40
+ prepare stmt from @sql;
41
+ execute stmt;
42
+ insert ignore into schedule_user(`sid`,`uid`) values(@sid,@uid);
43
+ commit;
44
+ end
45
+ //
46
+ delimiter ;
47
+ ```
48
+
49
+ - 新規スケジュール"D"とuid:102を追加
50
+ ```SQL
51
+ call s2us_sval_uid('D',102);
52
+ ```
53
+ 結果:sにDが追加され、usに4,102が追加
54
+
55
+ - 既存スケジュール"D"とuid:103を追加
56
+ ```SQL
57
+ call s2us_sval_uid('D',103);
58
+ ```
59
+ 結果:sには追加されないが、usに4,103が追加
60
+
61
+ - 既存スケジュール"D"とusにすでに存在するuid:102を追加
62
+ ```SQL
63
+ call s2us_sval_uid('D',102);
64
+ ```
65
+ 結果:sもusにも追加されない