MySQL:插入、更新和签入单个查询


MySQL: insert, update and check in a single query

我正在主持一个网站,授权用户可以在其中添加内容。内容被放置在网页上的块内。授权用户可以创建新的块,并按特定顺序放置块。块的顺序和内容存储在数据库中。

当创建新的块时,将执行以下两个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"只会更新与新插入冲突的行,但在我的情况下,其他行也需要更新。对于解决上述问题的查询,有什么建议吗?

查看事务数据库查询。这是完成你想要做的事情的正确方法。

正如Matt在评论中所说,您需要使用事务查询。像这样的事情可能会有所帮助。

START TRANSACTION;
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);
COMMIT;

因此,即使第一个查询失败,整个事务也会回滚并为您省去麻烦。