gpt4 book ai didi

php - 如何从 PHP 快速制作多个略有不同的插入

转载 作者:行者123 更新时间:2023-11-29 00:42:41 24 4
gpt4 key购买 nike

我正在执行大约 600 个 INSERT ON DUPLICATE KEY UPDATE 查询,其中每个插入可以有一组不同的列。

我现在的做法只是一个带有 mysql_query() 的 foreach 循环。真的很慢,php 脚本由于最大执行时间 30 秒而停止。

我不能使用 INSERT INTO table (columns) VALUES (values 1), (values 2), ..., (values n) 因为每个插入必须能够有一组不同的列。

我也查看了准备好的查询,但据我所知,它似乎也不适用于不同的列集。

我是数据库和MYSQL 的新手。我只是把一些东西拼凑成一个周末项目,现在我只想让项目的最后一部分开始工作。我很抱歉没有以正确的方式做到这一点。 (很抱歉也使用过时的 php mysql 函数。)也许我应该去 sleep ,稍后重写。正确的做法是什么?

编辑:这里是一些关于表格类型的信息

-- phpMyAdmin SQL Dump-- version 3.5.1-- http://www.phpmyadmin.net---- Host: localhost-- Generation Time: Jul 22, 2012 at 09:59 PM-- Server version: 5.5.24-log-- PHP Version: 5.3.13SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";SET time_zone = "+00:00";---- Database: `trailerbay`---- ------------------------------------------------------------ Table structure for table `movies`--CREATE TABLE IF NOT EXISTS `movies` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `imdb` int(7) NOT NULL,  `title` text COLLATE utf8_unicode_ci,  `releasedate` date DEFAULT NULL,  `enlistdate` datetime NOT NULL,  `runtime` time DEFAULT NULL,  `trailer` text COLLATE utf8_unicode_ci NOT NULL,  `plot` text COLLATE utf8_unicode_ci,  `cover` text COLLATE utf8_unicode_ci NOT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `id` (`id`),  UNIQUE KEY `imdb` (`imdb`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1145 ;

最佳答案

我不认为你可以在表中有那么多列,以至于它们的开/关组合多得令人望而却步。

因此,对于每一行,您可以提取其列组合(例如,您可以按字母顺序对字段进行排序)并将其结构用作键:

// $tuple has been sorted based on keys

$syndrome = implode(',', array_keys($tuple));

$values = array_values($tuple);

if (isset($big_inserts[$syndrome]))
array_push($big_inserts[$syndrome], $values);
else
$big_inserts[$syndrome] = array($values);

在循环结束时,您会发现自己有一个包含一定数量键的 $big_inserts 数组。每个键将映射一组值的数组,适用于多次插入。

除非您真的非常不幸,否则您的“多次插入”将比开始时的单个插入少得多。如果所有插入都具有相同的列,则 big_inserts 中只有一个键,用于保存所有元组。

现在,在 big_inserts 上循环,并且您可以为每个键准备一个语句。要发送到 PDO 的值数组是 $big_inserts[$key] 中所有元组的串联。

foreach($big_inserts as $fields => $lot)
{
$SQL = "INSERT INTO table ($fields) VALUES ";
// I need a (?.?.?---) tuple
$tuple = '('.implode(',', array_fill(0, count($lot[0]), '?')).')';
// How many tuples are in a lot?
$SQL .= implode(',', array_fill(0, count($lot), $tuple));
$values = array();
foreach($lot as $set)
$values = array_merge($values, $set);
// Now $SQL has all the '?'s, and $values contains all the values.
// Run the statement.
}

如果这还不够,您可能必须将语句分成 block ,将它们保存在 session 中并按顺序执行每个 block ,可能使用单独的表来模拟“多往返”事务(以防连接丢失/用户关闭浏览器/任何已经执行了一半 block 而另一半仍在执行的内容。使用直接插入到具有相同结构的表中,然后当表准备好时在事务中运行一个 INSERT INTO ... SELECT FROM 和提交后删除辅助表。

如果它们是简单的 INSERT,我会尝试暂时禁用一些索引,但是您依赖它们进行 ON DUPLICATE KEY UPDATE,所以这是不行的。

关于php - 如何从 PHP 快速制作多个略有不同的插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11604192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com