繁体   English   中英

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”将仅更新与新插入冲突的行,但在我的情况下,其他行也需要更新。 是否有任何建议可以解决上述问题?

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

正如马特在评论中所说,你需要使用交易查询。 这样的事情会很有帮助。

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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM