Как я могу объединить эти 25 запросов INSERT в один?

У меня есть веб-система, которая читает лист файла 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')");
}
}
?>

У меня есть пара вопросов:

  1. Возможно ли объединить все эти утверждения в одно?
  2. Существуют ли существенные изменения производительности при выполнении одного большого запроса, а не нескольких?

0

Решение

Да, вы можете сделать это с помощью одного оператора 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() сделано для такого рода целей.

Итак, ваш код может выглядеть так:

$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).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]