Mysql如何一次添加100条数据

最近想做一个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')...; 如果用语言的话很快