如何一次性插入多行记录 如何一次性插入多行记录?现在有多条数据,我用的方法是用编程语言的循环语句,重复执行多次INSERT语句的方式,不知道可不可以先将多条数据保存下来,只执行一条INSERT语句插入多行记录? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 insert into 你的表名 values(1),(2),(3),(4),(5) 从 源表 中筛选符合条件的记录,批量插入到 (指定的)目标表 中:insert into 目标表(字段1, 字段2,...字段n) select 字段1, 字段2,...字段n from 源表 where 条件 原始数据来源:比如从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只能一行一行的操作,比较麻烦,不知有没有好的解决方案? 把数据拼接成一个数据文件,就和mysql备份出来的一样,然后调用mysqldump导入。 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 可以使用Kettle 工具啊,批量导入很方便的 这里的 ON DUPLICATE KEY UPDATE 是针对每条记录而言的,也就是说如果记录不存在,则插入该行,如果有就更新原有的该行记录的某些字段 ON DUPLICATE KEY UPDATE 字段1=,字段2=显然INSERT INTO table (字段) VALUES (字段值) ,(字段值) ,(字段值) ,(字段值) ON DUPLICATE KEY UPDATE 。。不能针对每行记录进行更新! 原先的代码是这样的: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 = ?" 建议楼主做个简单的试验,看看你的 ON DUPLICATE KEY UPDATE 是否只更新了一行。 已经找到解决方案,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) MYSQL,语句优化问题查询 mysql 的二进制分发版 的下载链接? SQL 报错 Every derived table must have its own alias mysql库调用的问题。很奇怪,在LINUX下。 请教mysql5 auto id不能插入空值的问题 急,关于Mysql的delete data的几个问题 谁有mysqlJDBC的驱动程序?急!!! 求救,关于vc调用mysql的c API如何取得数值型字段的值 关于数据库创建的脚本 load data问题 小妹请教前辈帮我调一下or语句问题! 问一个数据库设计的问题
insert into 目标表(字段1, 字段2,...字段n) select 字段1, 字段2,...字段n from 源表 where 条件
{
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只能一行一行的操作,比较麻烦,不知有没有好的解决方案?
显然INSERT INTO table (字段) VALUES (字段值) ,(字段值) ,(字段值) ,(字段值) ON DUPLICATE KEY UPDATE 。。不能针对每行记录进行更新!
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 = ?"
VALUES ('key1','key2','value'), ('key1','key3','value2')
ON DUPLICATE KEY UPDATE
t.c = VALUES(t.c)