php - MySQLi 如果值不存在则插入

标签 php mysql mysqli

编辑:我忘了提及,如果新数据库中已存在具有相同列值的行,则我的脚本不应输入,这就是我在提到“重复条目”时的意思,尽管没有共同的 PK .

这是我的困境, 我正在使用 MySQLi 将数据从旧表迁移到具有不同设计的新表中,我希望我的程序能够运行多次,而无需乘以以前的条目。我最初的方法是对每个插入的元素进行验证查询:

//foreach elt of old table:
  $a = $old_table['a'];
  $b = $old_table['b'];
  $query = $db->query("SELECT `id` FROM `old_table` 
                       WHERE `a` = '$b' 
                       AND `b` LIKE '$b'")->fetch_assoc();
  if ($query == null) {
    //insert a row into the new table
  }

这种方法的问题在于运行时间非常可怕,我通过使用数据库事务设法大大减少了它:

$query = $db->prepare("INSERT INTO  `new_table` 
          (`a`, `b`, `c`, `d`, `e`)
          VALUES (?, ?, ?, ?, ?)");
$query->bind_param('isssi', $a, $b, $c, $d, $e);
$db->query("START TRANSACTION");
foreach ($old_table as $old_row) {
  $a = $old_row['a'];
  ...
  $e = $old_row['e'];
  $query->execute();
}
$query->close();
$db->query("COMMIT");

此方法的问题是,如果程序多次运行,则会产生多个条目。需要注意的是,由于两个表的设计不同,因此没有共同的主键,因此我认为我不能使用 DUPLICATE KEY。

想法?

最佳答案

其实你已经解决了问题,只是由于某种原因中途停了下来。

The problem with this method is that the run-time was horrendous and I managed to considerably cut it down by using a database transaction

我想知道你为什么不将 select 也包含到事务中。

Thoughts?

只需添加您在第一个变体中运行的选择查询即可。仅此而已。

关于php - MySQLi 如果值不存在则插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22415161/

相关文章:

php - 为什么这个 PHP 函数调用只工作一次?

php - 如何在 html 站点上执行来自 SDK 的命令?

php - FosUserBundle 在 FilterUserResponseEvent 中重定向

php - 如何使用 QuickForm 添加禁用的选择选项?

mysql - 如何使用 group by 'a' field by max of 'b' field 合并两个生成的表?

php - 在php中显示表中的数据

php - 解析错误:语法错误,第48行/home/a4673434/public_html/index.php中的意外$ end

mysql - 这个嵌入式 SQL 是用什么语言编写的?

javascript - 从 SQL 数据库填充 HTML Div(项目)

php - 我可以在 PHP 中混合使用 MySQL API 吗?