如何将这 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 查询合并为一个?的主要内容,如果未能解决你的问题,请参考以下文章

如何将这两条 SQL 语句合并为一条?

如何将这两个 SQL 查询组合成一个查询?

我有 2 个不同的条形图,它们有一个共同的 X 轴和 2 个不同的 Y 轴。我想使用 python 将这两个使用 X 轴的图合并为一个

Bigquery:如何将 2 个时间戳列合并为 1 个列?

sql插入数据问题

在sql中组合多个计数查询