如何一次性插入多行记录

zhouzb889 2010-03-23 05:44:10
如何一次性插入多行记录?

现在有多条数据,我用的方法是用编程语言的循环语句,重复执行多次INSERT语句的方式,不知道可不可以先将多条数据保存下来,只执行一条INSERT语句插入多行记录?
...全文
613 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouzb889 2010-03-25
  • 打赏
  • 举报
回复
已经找到解决方案,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)
ACMAIN_CHM 2010-03-24
  • 打赏
  • 举报
回复
[Quote]显然

INSERT INTO table (字段) VALUES (字段值) ,(字段值) ,(字段值) ,(字段值) ON DUPLICATE KEY UPDATE 。。

不能针对每行记录进行更新![/Quote]

可以啊,你是如何做测试的?能否提供你的测试用例。
zhouzb889 2010-03-24
  • 打赏
  • 举报
回复
这里的 ON DUPLICATE KEY UPDATE 是针对每条记录而言的,也就是说如果记录不存在,则插入该行,如果有就更新原有的该行记录的某些字段

ON DUPLICATE KEY UPDATE 字段1=,字段2=


显然

INSERT INTO table (字段) VALUES (字段值) ,(字段值) ,(字段值) ,(字段值) ON DUPLICATE KEY UPDATE 。。

不能针对每行记录进行更新!
sjzzy 2010-03-24
  • 打赏
  • 举报
回复
可以使用Kettle 工具啊,批量导入很方便的
ldb2741 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 acmain_chm 的回复:]
INSERT INTO table (字段) VALUES (字段值) ,(字段值) ,(字段值) ,(字段值) ON DUPLICATE KEY UPDATE 。。

参考一楼的语法。但须注意SQL语句的最大长度限制。

另外一个方法,就是把你的EXCEL另存为CSV格式,然后使用语句 LOAD DATA INFILE 一句全部导入。 具体语法和例子请参考手册中的说明。

MySQL……
[/Quote]

SQL语句的最大长度限制是多少
ACMAIN_CHM 2010-03-24
  • 打赏
  • 举报
回复
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
ACMAIN_CHM 2010-03-24
  • 打赏
  • 举报
回复
建议楼主做个简单的试验,看看你的 ON DUPLICATE KEY UPDATE 是否只更新了一行。
zhouzb889 2010-03-24
  • 打赏
  • 举报
回复
原先的代码是这样的:
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 = ?"
yangxiao_jiang 2010-03-23
  • 打赏
  • 举报
回复
把数据拼接成一个数据文件,就和mysql备份出来的一样,然后调用mysqldump导入。
zhouzb889 2010-03-23
  • 打赏
  • 举报
回复
原始数据来源:

比如从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只能一行一行的操作,比较麻烦,不知有没有好的解决方案?
狂龙骄子 2010-03-23
  • 打赏
  • 举报
回复
从 源表 中筛选符合条件的记录,批量插入到 (指定的)目标表 中:
insert into 目标表(字段1, 字段2,...字段n) select 字段1, 字段2,...字段n from 源表 where 条件

ACMAIN_CHM 2010-03-23
  • 打赏
  • 举报
回复
你的原始数据从哪而来?
ldb2741 2010-03-23
  • 打赏
  • 举报
回复
insert into 你的表名 values(1),(2),(3),(4),(5)

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧