繁体   English   中英

MySQL在表中插入多行(如果尚不存在)

[英]MySQL insert multiple rows into a table if they don't already exist

如果我有这样一个表:

+-------------+-------------+
| Field       | Type        |
+-------------+-------------+
| document    | varchar(35) |
| section     | int(11)     |
| selection   | int(11)     |
| status      | varchar(35) |
+-------------+-------------+

我在PHP中有一个数组。 我们称之为$choices[] selection对应于choices数组的数组索引。 如果我向$choices数组中添加一个或多个元素,则需要更新数据库。 我将在其中还设置了$document$section的循环中操作。 我不想假设编号中间没有缺失的行。 $choices每个元素检查(文档,节,选择),创建不存在的任何元素并将其状态设置为“新”的最有效方法是什么? 我是否必须以循环方式执行此操作,或者是否可以在一个查询中执行此操作?

这是完全未经测试的,但是如果我不寻求帮助,这基本上就是我会做的。 我猜想有人可能会比我有更好的解决方案。

foreach($documents as $document)
  {
    foreach($sections as $section)
      {
        $choices=$master_array[$document][$section];
        $ch_count=count($choices);
        $counter=0;
        while($counter < $ch_count-1)
          {
            $query="SELECT status FROM mytable WHERE document='$document' AND section='$section' AND selection='$counter'";
            $result = mysql_query($query);
            if(mysql_num_rows($result)==0)
              {
                $query="INSERT INTO mytable VALUES('$document','$section','$counter','new')";
                $result = mysql_query($query);
              }
            $counter++;
          }
      }
   } 

如果所有内容都将使用“ new”进行更新,则可以轻松实现这一点。

检查以下代码:

<?
$setStr = "";
foreach($choices as $column)
{
    $setStr .= $column . "=" . "'new', ";
}

$sqlCommand = "UPDATE table SET ".substr($setStr,'',-2)." WHERE pick_a_row_here;";
echo $sqlCommand;
?>

对于不存在的值,请尝试对其进行配置,以便在未指定时将其值默认为false。 当然,可以根据我上面的UPDATE语句轻松地修改INSERT语句。

让我知道你的想法。 如果您有任何问题或意见,我会尽力回答。

我最终使用循环将一个大查询字符串连接起来,看起来像这样,除了更大:

INSERT IGNORE INTO mytable VALUES 
('doc1','1','0','New'),
('doc1','1','1','New'),
('doc1','1','2','New'),
('doc1','1','3','New'),
('doc1','2','0','New'),
('doc1','2','1','New'),
('doc1','2','2','New'),
('doc1','2','3','New'),
('doc1','3','0','New'),
('doc1','3','1','New'),
('doc1','3','2','New')

而且有效。 无论它是否是最好的,我都不知道,但至少我没有向数据库发送数百个查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM