如何将这 25 个 INSERT 查询合并为一个?
Posted
技术标签:
【中文标题】如何将这 25 个 INSERT 查询合并为一个?【英文标题】:How can I join these 25 INSERT queries into just one? 【发布时间】:2015-03-21 14:03:30 【问题描述】:我有一个基于网络的系统,可以读取一张 excel 文件(上传的每张表格是 6 行 5 列),如下所示:
下面是我正在使用的代码(出于演示目的,我为 $entry 设置了静态值,但它的真实代码例如是$entry1=$objTpl->getActiveSheet()->getCell('A2')->getValue();
$con=mysqli_connect("localhost","root","","view");
if(isset($_POST['submit']))
$entry1 = 1;
$entry2 = 2;
$entry3 = 3;
$entry4 = 4;
$entry5 = 5;
$entry6 = 1;
$entry7 = 2;
$entry8 = 0;
$entry9 = 4;
$entry10 = 0;
$entry11 = 0;
$entry12 = 2;
$entry13 = 3;
$entry14 = 4;
$entry15 = 0;
$entry16 = 1;
$entry17 = 2;
$entry18 = 0;
$entry19 = 0;
$entry20 = 5;
$entry21 = 1;
$entry22 = 0;
$entry23 = 3;
$entry24 = 0;
$entry25 = 5;
if($entry1 != 0 || !empty($entry1))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry1','$entry1')");
if($entry2 != 0 || !empty($entry2))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry2','$entry2')");
if($entry3 != 0 || !empty($entry3))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry3','$entry3')");
if($entry4 != 0 || !empty($entry4))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry4','$entry4')");
if($entry5 != 0 || !empty($entry5))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry5','$entry5')");
if($entry6 != 0 || !empty($entry6))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry6','$entry6')");
if($entry7 != 0 || !empty($entry7))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry7','$entry7')");
if($entry8 != 0 || !empty($entry8))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry8','$entry8')");
if($entry9 != 0 || !empty($entry9))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry9','$entry9')");
if($entry10 != 0 || !empty($entry10))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry10','$entry10')");
if($entry11 != 0 || !empty($entry11))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry11','$entry11')");
if($entry12 != 0 || !empty($entry12))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry12','$entry12')");
if($entry13 != 0 || !empty($entry13))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry13','$entry13')");
if($entry14 != 0 || !empty($entry14))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry14','$entry14')");
if($entry15 != 0 || !empty($entry15))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry15','$entry15')");
if($entry16 != 0 || !empty($entry16))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry16','$entry16')");
if($entry17 != 0 || !empty($entry17))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry17','$entry17')");
if($entry18 != 0 || !empty($entry18))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry18','$entry18')");
if($entry19 != 0 || !empty($entry19))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry19','$entry19')");
if($entry20 != 0 || !empty($entry20))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry20','$entry20')");
if($entry21 != 0 || !empty($entry21))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry21','$entry21')");
if($entry22 != 0 || !empty($entry22))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry22','$entry22')");
if($entry23 != 0 || !empty($entry23))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry23','$entry23')");
if($entry24 != 0 || !empty($entry24))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry24','$entry24')");
if($entry25 != 0 || !empty($entry25))
mysqli_query($con,"INSERT INTO viewer(base_id,name,value) VALUES('1','entry25','$entry25')");
?>
我确实有几个问题:
-
是否可以将所有这些语句合二为一?
执行一个大查询而不是多个大查询时,性能是否有显着变化?
【问题讨论】:
是的,是的。可以在一个语句中插入多组数据,查看dev.mysql.com/doc/refman/5.6/en/insert.html 这有点棘手,因为它们不是静态的,我无法进行静态 sql 查询。我无法将持有这些('1','entry1','$entry1')
的变量合并到一个语句中,因为我在放置逗号时会遇到问题。然而,我发现的一个解决方案是允许 0,以便我可以创建一个静态查询,然后删除所有具有 0 值的行。
【参考方案1】:
是的,您可以使用一条 SQL 语句来完成此操作。它会像这样工作。您可以根据需要将任意多组 (val, val, val) 串在一起。 (整体查询的字符串长度是有限制的,但是在MySQL中是相当大的)。
INSERT INTO viewer(base_id,name,value) VALUES
('1','entry1','$entry1'),
('1','entry2','$entry2'),
('1','entry3','$entry3')
如果您要向 InnoDB 表中插入内容,那么当您的连接处于自动提交模式时,这样做会大大提高性能。那是因为您将插入中的所有行一起提交,并且提交有开销。
编辑
在 php 中,如果您有一个数组 $values,其中每个元素都包含一个文本字符串,例如(1,'val','val')
,您可以使用此代码来创建您的查询字符串。
$sqlstart = 'INSERT INTO viewer(base_id,name,value) VALUES ';
$sql = sqlstart . implode(',' , $values);
这会将逗号 放在 之间,但不在 $values 数组的元素之后。 implode()
is made for this kind of purpose。
因此,您的代码可能如下所示:
$values = array(); /* make an empty array */
if ($entry1 != 0 || !empty($entry1))
$values[] = "('1','entry1','$entry1')"; /* append to array */
if ($entry2 != 0 || !empty($entry2))
$values[] = "('1','entry2','$entry2')";
/* etc etc for the rest of your $entry values */
$sqlstart = 'INSERT INTO viewer(base_id,name,value) VALUES ';
$sql = sqlstart . implode(',' , $values);
(请注意 SQL 插入漏洞)。
【讨论】:
我确实尝试过这条路径,但是,我遇到了逗号问题。如果我尝试制作 $statement1 = ('1','entry1','$entry1');并将这些 $statements 回显到 sql 查询中。我无法正确放置逗号,因为这些值不是静态的。 如果我试图创建一个看起来像这样的查询INSERT INTO viewer(base_id,name,vale) VALUES $statement1,$statement2
等等,我会遇到逗号问题,因为当 $statement 不存在时,我可以有两个逗号,因为它是 0或没有值。
@CarlEren 我不明白这个问题,您可以使用与多个语句相同的逻辑来构建您的单个 sql 语句。
我不知道如何用逗号分隔它们,因为这些值不是静态的。例如,如果我有$statement1=('1','entry1','$entry1'); $statement2=('1','entry2','$entry2');
,然后将其回显到此查询INSERT INTO viewer(base_id,name,value) VALUES $statement1 $statement2
中,但这就是问题所在,我不知道如何放置逗号,因为我无法知道哪个有值。请记住,这是一个用于将这些电子表格上传到数据库的系统,如果我尝试上传具有较少值的其他电子表格,我的旧查询将无法成功。
如果我尝试创建此查询"INSERT INTO viewer(base_id,name,value) VALUES $statement1,$statement2";
如果我上传的第二个电子表格没有 $entry2 会怎样?这意味着"INSERT INTO viewer(base_id,name,value) VALUES $statement1,";
,因为如果 $entry2 有值,则 $statement2 将被声明。以上是关于如何将这 25 个 INSERT 查询合并为一个?的主要内容,如果未能解决你的问题,请参考以下文章
我有 2 个不同的条形图,它们有一个共同的 X 轴和 2 个不同的 Y 轴。我想使用 python 将这两个使用 X 轴的图合并为一个