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

回答編集履歴

1

sample

2018/11/19 06:01

投稿

yambejp
yambejp

スコア117820

answer CHANGED
@@ -1,2 +1,59 @@
1
1
  プロシージャをつかって処理しますが、そもそもidがユニークじゃないですが大丈夫ですか?
2
- なんらかのプライマリーキーが必要そうなテーブルに見えます
2
+ なんらかのプライマリーキーが必要そうなテーブルに見えます
3
+
4
+ # sample
5
+ ```SQL
6
+ create table test_table(ID int primary key auto_increment, Name varchar(10),CreatedDate datetime, CreatedBy varchar(10), LastUpdatedDate datetime, LastUpdatedBy varchar(10));
7
+ alter table test_table auto_increment = 100000007;
8
+ ```
9
+ 以下、投入のしかたは2つ考えられますが、圧倒的に後者の方が速いです
10
+ (私の環境だと100倍以上速かったです)
11
+
12
+ (1)単純な入力
13
+ ```SQL
14
+ drop procedure if exists test_procedure1;
15
+ delimiter //
16
+ create procedure test_procedure1()
17
+ begin
18
+ declare i int default 0;
19
+ while i<1000 do
20
+ set @sql="insert ignore into test_table(Name,CreatedDate,CreatedBy,LastUpdatedDate,LastUpdatedBy) ";
21
+ set @sql=concat(@sql,"values('テスト', now(), '佐藤', now(), '佐藤')");
22
+ prepare stmt from @sql;
23
+ execute stmt;
24
+ set i=i+1;
25
+ end while;
26
+ end
27
+ //
28
+ delimiter ;
29
+ call test_procedure1
30
+ ```
31
+
32
+ (2)まとめて入力
33
+ ```SQL
34
+ drop procedure if exists test_procedure2;
35
+ delimiter //
36
+ create procedure test_procedure2()
37
+ begin
38
+ declare i int default 0;
39
+ set @sql="insert ignore into test_table(Name,CreatedDate,CreatedBy,LastUpdatedDate,LastUpdatedBy) ";
40
+ while i<1000 do
41
+ if i=0 then
42
+ set @sql=concat(@sql,"values");
43
+ else
44
+ set @sql=concat(@sql,",");
45
+ end if;
46
+ set @sql=concat(@sql,"('テスト', now(), '佐藤', now(), '佐藤')");
47
+ set i=i+1;
48
+ end while;
49
+ prepare stmt from @sql;
50
+ execute stmt;
51
+ end
52
+ //
53
+ delimiter ;
54
+ call test_procedure2
55
+ ```
56
+
57
+ ただし、後者のように膨大な文字列を処理する場合はメモリなどの制約もあるので
58
+ 経験上1万程度を上限と考えたほうがよいでしょう。
59
+ 例えば100万件のデータを投入する場合は、1万件のデータ投入を100回やるイメージです