【问题标题】:Attempt to update one mySQL table with data from two other tables is failing尝试使用来自其他两个表的数据更新一个 mySQL 表失败
【发布时间】:2011-12-14 10:36:12
【问题描述】:

我正在尝试更新一个包含员工输入数据的表。该表包含三列:条目 ID、字段 ID 和值。我想确保根据每个条目,此表中的每个字段都有一行。因此,我编写了以下 php/sql 脚本。思考过程是获取两个数组(一个包含条目 ID,另一个包含字段 ID)并检查输入表以查看每个字段和条目是否存在现有行。如果不是,则使用 inert into 命令添加值为 0 的行,但此命令失败。我的猜测是由于此功能的强度而导致的超时错误。有什么建议吗?

$db = JFactory::getDBO(); $field_query = '从 `jos_directory_field` 中选择 id'; $db->setQuery($field_query); $fields = $db->loadObjectList(); $entry_query = '从 `jos_directory_entry` 中选择 id'; $db->setQuery($entry_query); $entries = $db->loadObjectList(); for($e=0;$e 计数($entries);$e++) { for($i=0;$i 计数($fields);$i++) { $insert_query = 'INSERT INTO `jos_directory_enf` (entry_id,field_id,field_value)'; $insert_query .= 'SELECT '.$entries[$e]->id.','.$fields[$i]->id.',0'; $insert_query .= 'FROM dual WHERE NOT EXISTS (SELECT * FROM `jos_directory_enf`'; $insert_query .= 'WHERE entry_id = '.$entries[$e]->id.'和 field_id = '.$fields[$i]->id.')'; $db->setQuery($insert_query); $db->查询(); } }

【问题讨论】:

  • 这个炸弹是立即爆炸,还是似乎挂了?
  • 表有多大——你可能会因为你的表大小而从 PHP 本身获得内存不足(嗯,可能有点不太可能)。另外,你在哪个COMMIT 级别下运行?
  • 您有一个名为 DUAL 的实际表吗?或者这是 ORACLE 语法的继承?
  • @MarcB 它运行了大约 30 到 60 秒,然后导致内部服务器错误。
  • @X-Zero 我对问题的假设是通过 PHP 超时。我不知道 COMMIT 级别是什么。

标签: php mysql sql


【解决方案1】:

太糟糕了,Joomla 似乎不支持准备好的语句,因为它们可以帮助提高重复查询的性能。

但是,在这种情况下,有更好的选择。您应该能够使用单个 SQL 语句替换 PHP 代码,将 IGNORE 子句用于 INSERT 语句。首先,确保在jos_directory_enfentry_idfield_id 列上有一个unique index。那么 SQL 语句会是这样的:

INSERT IGNORE INTO `jos_directory_enf` (entry_id,field_id,field_value)
  SELECT e.id, f.id, 0
  FROM jos_directory_entries AS e
    JOIN jos_directory_field AS f
;

.

【讨论】:

  • 我认为 INSERT IGNORE 会重复行,但我还是决定按照您的建议运行它。它确实复制了每个现有行并添加了所需的行。
  • 听起来你没有创建唯一索引,正如我提到的那样。如果这样做,重复行将导致重复键错误,从而阻止添加行。 IGNORE 将防止错误停止查询。
猜你喜欢
  • 1970-01-01
  • 2014-01-20
  • 2020-08-24
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
相关资源
最近更新 更多