如何最好地将数组(100或更长)放入数据库(MySQL)?
我不希望多次访问数据库,因为它是如此加载的。
所以我的解决方案如下:
string insert = "INSERT INTO programs (name, id) VALUES ";
for(int i = 0; i < name.Length; i++)
{
if (i != 0)
{
insert = insert + ",(";
}
else
{
insert = insert + "(";
}
insert = insert + "'" + name[i] + "','" + id[i] + "'";
insert = insert + ")";
}
//INSERT INTO programs (name, id) VALUES ('Peter','32'),('Rikko','343') ....
但也许是一个更快的版本?
谢谢
答案 0 :(得分:3)
如果用户可以更改名称和ID(可能的SQL注入),则您的解决方案非常不安全。我建议使用准备好的声明来加快速度。 MySQL documentation
中有一个例子答案 1 :(得分:1)
我以前从未使用过MySql,而且我没有编译过这个,但这就是我接近它的方法。
我会定义一个参数化的sql字符串。然后我将定义我的参数对象,打开连接,然后遍历数组,将值分配给参数对象并执行语句。
using(var connection = new MySqlConnection("your connection string"))
{
using(var command = new MySqlCommand("INSERT INTO programs (name, id) VALUES (?name, ?id)", connection))
{
var nameParameter = new MySqlParameter("name");
var idParameter = new MySqlParameter("id");
command.Parameters.Add(nameParameter);
command.Parameters.Add(idParameter);
connection.Open();
for(int i = 0; i < name.Length; i++)
{
nameParameter.Value = name[i];
idParameter.Value = id[i];
command.ExecuteNonQuery();
}
connection.Close(); //Dispose being called by the using should close connection, but it doesn't hurt to close it here/sooner either.
}
}
就像我说的那样,我之前没有使用过C#中的MySql,所以我不知道MySqlParameter类是否有一个接受参数名称的构造函数,但是你明白了。
答案 2 :(得分:0)
我觉得你可以做点什么
INSERT INTO tbl_temp2 (fld_id)
SELECT tbl_temp1.fld_order_id
FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
并通过一个查询插入所有内容
答案 3 :(得分:0)
我认为你需要使用绑定变量。与大多数其他SQL数据库一样,MySQL确实允许它,它比一次创建和运行100个插入语句要快得多。
首先prepare
你的SQL语句,放入绑定变量所在的?
。然后execute
使用一个数组,其中包含单个插入的所有值。
例如,
$stmt = $db->prepare("insert into table values (?, ?)");
$array = array(1, 2);
$result = $db->execute($stmt, $array);