我正在托管一个网站,授权用户可以在其中添加内容。内容放置在网页上的块内。授权用户能够创建新块并将块按特定顺序放置。块的顺序和内容存储在数据库中。
创建新块时,将执行以下两个 MySQL 查询:
使用以下查询更新数据库中块的订单号:
UPDATE `Block`
SET `block_order` = `block_order` + 1
WHERE `tab_nr` = $tab_nr
AND `block_order` > $nr;
通过执行以下查询添加新块:
INSERT INTO `Block`
(`id`, `tab_nr`, `block_order`, `html`, `created`)
VALUES
(NULL, $tab_nr, $nr + 1, '$html', CURRENT_TIMESTAMP);
这些查询的问题在于,无论第二个查询发生什么,都会执行第一个查询。如果第二个查询失败(无论原因是什么),其他块的订单号仍然会因第一个查询的执行而改变。这样,大宗订单号就搞砸了。
我需要的是一个单独的查询,它将新块添加到数据库中,并且当且仅当有相同编号的块时才更新其他块的订单号。但问题是我找不到能满足我所有需要的查询。例如“ON DUPLICATE KEY UPDATE”只会更新与新插入冲突的行,但在我的情况下,其他行也需要更新。对于摆脱上述问题的查询有什么建议吗?