最近想做一个Mysql中添加一个相同字段描述的,不同id的数据,就想一次在Sql语句中添加100条数据哈。。
下面的语句在本地 navicat for Mysql中可以用,但是在服务器端的linux中的就会报语句错误
CREATE PROCEDURE loop_insert3(IN i INT)
BEGIN
WHILE i <= 200 DO
INSERT INTO g_order(g_name,price,u_id,create_time)
VALUES ('新用户优惠券','158',CONCAT('',i),'2022-03-12 10:00:00');
SET i=i+1;
END WHILE;
END;
CALL loop_insert3(1);
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;
public class SQLGenApplication {
public static void main(String[] args) throws IOException {
StringBuilder insertBuf = new StringBuilder("INSERT INTO `table1` (`id`, `uid`, `a`, `b`) VALUES");
String values = "('%s', '%s', '%s.00', '%s.00'),";
BufferedReader fis = new BufferedReader(new FileReader("fileParam.txt"));
String line = null;
Random r = new Random();
int cnt = 0;
int batch = 0;
int perCnt = 2500;
while((line = fis.readLine()) != null) {
long id = Long.parseLong(line.substring(8));
int i = r.nextInt(100);
while(i <= 0 ) {
i = r.nextInt(100);
}
int i2 = r.nextInt(100);
while(i2 < i ) {
i2 = r.nextInt(100);
}
insertBuf.append(String.format(values, id, line, i, i2));
if(cnt < perCnt) {
cnt++;
} else {
insertBuf.deleteCharAt(insertBuf.length()-1);
insertBuf.append(";");
FileWriter fw = new FileWriter("fileSQL" + batch + ".sql");
fw.write(insertBuf.toString());
fw.flush();
fw.close();
cnt = 0;
batch++;
insertBuf = new StringBuilder("INSERT INTO `table1` (`id`, `uid`, `a`, `b`) VALUES");
}
}
if(cnt != 0 && cnt < perCnt) {
insertBuf.deleteCharAt(insertBuf.length()-1);
insertBuf.append(";");
FileWriter fw = new FileWriter("fileSQL" + batch + ".sql");
fw.write(insertBuf.toString());
fw.flush();
fw.close();
cnt = 0;
}
fis.close();
}
}
熟悉MYSQL语句,应该了解
INSERT INTO table_name (col1,col2,...), VALUES
(val1, val2,...),
(val1,val2,...),
....
直接利用本地程序拼接sql语句,然后执行即可。
INSERT 语句不需要担心注入攻击,不过为了数据库安全,请提前做好校验。
insert into table_name valus(xxx,xxxx),(hhhh,ggggg)…
values后边每个括号就是一行数据
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...),
(value1,value2,value3,...),
(value1,value2,value3,...),
(value1,value2,value3,...),
(value1,value2,value3,...),
...100个...
(value1,value2,value3,...);
例子:
insert into [Test].[dbo].[SQLTEST]
values(1801301, '小余' ,18, '男' ,10089, '中学'),
(1801302, '小钱' ,18, '女' ,10090, '中学'),
(1801303, '小王' ,20, '女' ,10091, '大学'),
(1801304, '小赖' ,22, '男' ,10092, '大学'),
(1801305, '小钟' ,22, '男' ,10093, '大学'),
(1801305, '小吕' ,22, '男' ,10093, '大学')
这么个简单的东西没必要还写个存储过程用循环去插,用下面这个就行了,原理是借助一张系统表的数值列,但是它上限是700
insert into g_order(g_name,price,u_id,create_time)
select '新用户优惠券','158',CONCAT('',h.help_topic_id+1),'2022-03-12 10:00:00'
from mysql.help_topic h where h.help_topic_id<200;
另外,你使用mysql命令行工具创建存储过程时,需要注意修改结束符定义,否则它识别到分号就以为命令完了,像你那段代码应该改成下面这样再去执行
delimiter $$
CREATE PROCEDURE loop_insert3(IN i INT)
BEGIN
WHILE i <= 200 DO
INSERT INTO g_order(g_name,price,u_id,create_time)
VALUES ('新用户优惠券','158',CONCAT('',i),'2022-03-12 10:00:00');
SET i=i+1;
END WHILE;
END$$
delimiter ;
CALL loop_insert3(1);
insert into userInfo(name,password) values('ddf','8979'),('fsd','343'),('sf','45')...; 如果用语言的话很快