如何一次性插入多行记录?现在有多条数据,我用的方法是用编程语言的循环语句,重复执行多次INSERT语句的方式,不知道可不可以先将多条数据保存下来,只执行一条INSERT语句插入多行记录?

解决方案 »

  1.   

    insert into 你的表名 values(1),(2),(3),(4),(5)
      

  2.   

    从 源表 中筛选符合条件的记录,批量插入到 (指定的)目标表 中:
    insert into 目标表(字段1, 字段2,...字段n) select 字段1, 字段2,...字段n from 源表 where 条件
      

  3.   

    原始数据来源:比如从exel中来,每行就是一条记录,我用php从exel中一行一行读出来,我采取的是这种方法:for (i = 0; i < exeal最大行数; i++)
    {
        for (i = 0; i < exeal最大列数; i++)
        {
            //此处获得exel中的一行所有数据
        }
        // SQL INSERT 将该行数据插入表中
    }要是以这种方式执行的话,要执行的INSERT次数为 :exeal最大行数这样效率很低,如果exel中有1000行数据,就要执行1000次INSERT语句!我现在是想,如何用一种简便的方式,先将要插入的所有行的数据保存下来,然后只执行一次INSERT语句将所有的记录插进数据库表中,我现在使用的INSERT语句是 INSERT INTO table (字段) VALUES (字段值) ON DUPLICATE KEY UPDATE 。。考虑起来,ON DUPLICATE KEY UPDATE只能一行一行的操作,比较麻烦,不知有没有好的解决方案?
      

  4.   

    把数据拼接成一个数据文件,就和mysql备份出来的一样,然后调用mysqldump导入。
      

  5.   

    INSERT INTO table (字段) VALUES (字段值) ,(字段值) ,(字段值) ,(字段值) ON DUPLICATE KEY UPDATE 。。参考一楼的语法。但须注意SQL语句的最大长度限制。另外一个方法,就是把你的EXCEL另存为CSV格式,然后使用语句 LOAD DATA INFILE 一句全部导入。 具体语法和例子请参考手册中的说明。MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
      

  6.   

    可以使用Kettle 工具啊,批量导入很方便的
      

  7.   

    这里的 ON DUPLICATE KEY UPDATE 是针对每条记录而言的,也就是说如果记录不存在,则插入该行,如果有就更新原有的该行记录的某些字段 ON DUPLICATE KEY UPDATE 字段1=,字段2=
    显然INSERT INTO table (字段) VALUES (字段值) ,(字段值) ,(字段值) ,(字段值) ON DUPLICATE KEY UPDATE 。。不能针对每行记录进行更新!
      

  8.   

    原先的代码是这样的:
    for (i = 2; i < numRows; i++)
    {
        for (j = 1; j < numCols; j++)
        {
         //获得exel中第 j 行4列的值 x1 ~ x4
            $exelCols1 = x1; 
            $exelCols2 = x2;
            $exelCols3 = x3;
            $exelCols4 = x4;
        }
        // table1 中 Cols1和Cols2 两行联合唯一
        $SQL =  "INSERT INTO table1 (cols1, cols2, cols3, cols4) VALUES ($exelCols1, $exelCols2, $exelCols3, $exelCols4) ON DUPLICATE KEY UPDATE cols3 = $exelCols3, cols4 = $exelCols4";
        // 执行SQL语句, 若不存在由cols1和cols2联合确定的唯一记录,则INSERT,否则更新该行记录的 cols3 和 cols4列
    }
    若采用以下这种SQL语句,可以先拼接SQL,然后只执行一次INSERT语句:
    INSERT INTO table (字段) VALUES (字段值) ,(字段值) ,(字段值) ,(字段值) ON DUPLICATE KEY UPDATE 。。现在的问题是若将所有for语句获取到的数据拼接起来,再执行一次INSERT,那后面的ON DUPLICATE KEY UPDATE怎么写?cols3 和 cols4的值从哪来,还能只针对一行记录吗?若ON DUPLICATE KEY UPDATE放在最后,cols3 和 cols4的值只能从exel的最后一行取了.尝试以下修改:
    for (i = 2; i < numRows; i++)
    {
        for (j = 1; j < numCols; j++)
        {
         //获得exel中第 j 行4列的值 x1 ~ x4
            $exelCols1 = x1; 
            $exelCols2 = x2;
            $exelCols3 = x3;
            $exelCols4 = x4;
        }
        if (i == 2)
         $SQL =  "INSERT INTO table1 (cols1, cols2, cols3, cols4) VALUES ($exelCols1, $exelCols2, $exelCols3, $exelCols4)";
        else
         $SQL =  $SQL.",($exelCols1, $exelCols2, $exelCols3, $exelCols4)";
    }
    $SQL = $SQL." ON DUPLICATE KEY UPDATE cols3 = ?, cols4 = ?"
      

  9.   

     建议楼主做个简单的试验,看看你的 ON DUPLICATE KEY UPDATE 是否只更新了一行。
      

  10.   

    已经找到解决方案,ON DUPLICATE KEY UPDATE 使用sql的VALUES()即可,可以针对每行记录:INSERT INTO t (t.a, t.b, t.c) 
    VALUES ('key1','key2','value'), ('key1','key3','value2') 
    ON DUPLICATE KEY UPDATE 
    t.c = VALUES(t.c)