插入&;无需多次查询即可删除MySQL数据库中的行
在阅读问题之前检查此示例- 以下数据来自一个表单,用户只需从特价中删除一个产品插入&;无需多次查询即可删除MySQL数据库中的行,mysql,query-optimization,sql-insert,sql-delete,Mysql,Query Optimization,Sql Insert,Sql Delete,在阅读问题之前检查此示例- 以下数据来自一个表单,用户只需从特价中删除一个产品 Array( 'special_offer_id' => 1, 'product_ids' => Array( 0 => 1, 0 => 2 ) ) 最初我想使用这个查询 REPLACE INTO `foo` VALUES (1, 1), (2, 1); 但这不会删除用户删除的产品,只会更新其他产品 所以我不得不执行两个查询 DELE
Array(
'special_offer_id' => 1,
'product_ids' => Array(
0 => 1,
0 => 2
)
)
最初我想使用这个查询
REPLACE INTO `foo` VALUES (1, 1), (2, 1);
但这不会删除用户删除的产品,只会更新其他产品
所以我不得不执行两个查询
DELETE FROM `foo` WHERE `special_offer_id` = 1;
INSERT INTO `foo` VALUES (1, 1), (2, 1);
有没有更好的方法不必执行两次查询就可以做到这一点
示例:我认为在MySQL中不可能组合DML语句。我知道Oracle和MSSQL有这个合并功能,但我认为MySQL没有这个功能,但我不太确定 看看你的小提琴和代码的实际功能,我想出了一个不同的方法。如果您循环当前的数据数组,并将输出放入1个变量中,然后使用delete删除不匹配的行 下面是一个基于sqlfiddle的示例(请注意,数组无效,因为它在fiddle中没有正确命名)
多个查询有什么问题?也许最好的方法是使用存储过程。它们没有问题,我只是想知道是否有一种更可取的方法。为什么您认为REPLACE不会删除记录?使用SELECT ROW\u COUNT()查询选中此项。您的PK是复合密钥(product\u id,special\u offer\u id)。因为
替换为只会更新数组中的两条记录,而忽略已删除的记录。替换语句首先检查唯一字段(product\u id
和special\u offer\u id
),然后删除并插入新记录,或者只是插入一个新的。在您的情况下,特殊优惠\u id
字段不是唯一的。
// Declare var and fill with array result
$exists = '';
for ($c = 0; $c < count($array); c++)
{
if ($c == (count($array) -1))
{
$exists .= $array[$c]['product_ids'];
}
else
{
$exists .= $array[$c]['product_ids'].',';
}
}
DELETE FROM `foo` WHERE `special_offer_id` NOT IN ('.$exists.');