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