数据库插入是否需要每次都判断插入结果
发布于 6 年前 作者 DavidLuman 3784 次浏览 来自 问答

mysql每次insert插入数据时,需不需要每次查看返回的affectedRows不为0。即会不会出现插入失败的情况,如果数据正确的话。

还有一个问题:关联表的话,比如有一个商品表(id,info)和一个商品图片表(id,goods_id, image_path), 为了保持数据一致性,怎么做到用程序控制来控制插入商品表的同时插入商品图片表,而不是用触发器。 我的做法是先n插入商品表,然后获得insertId(即goods_id),再用insertId作为参数把图片路径插入商品图片表。 但是这样有一个问题,如果商品表的商品信息插入成功,而商品图片表插入失败,那么即使返回到前端说添加商品失败,数据库里还是多了商品信息,只是没有图片信息而已,这样数据就不能保持一致性。 本来想用事务来解决,但是事务的话不知道怎么在sql语句立即获得插入的商品id。 还有实在得用触发器的话,还是同样的问题:要怎么立即获得插入的商品id。 请问有什么好的解决方法

11 回复

用sequelize+async/await可以返回插入商品的id

@jacksparrow68 商品id查insertId可以得到,主要是根据这个商品id来进行商品图片插入的话,如果插入失败,那么数据就不一致了,因为商品插入商品表成功了,而商品图片插入商品图片没成功

@DavidLuman 你没明白我的意思,sequelize支持事物,你把插入商品和插入商品图片放在一个事物里面就好了啊;还有,商品id在插入商品之后会返回的,不用你再去查一遍,这是sequelize的一个方便之处

@DavidLuman let res = await this.model().create(obj, { returning: true }) 这里你可以通过res.get()获得你刚才插入的记录(包括自动生成的id);这样你就可以拿这个id去插入你的商品图片表了

需要,尤其是在事务中,很多人以为开了事务 执行成功,运行结果就能达到预期。很遗憾这个结论是错的。 insert倒还好,重点是update,如果不判断影响条数,即使一条没更新,事务还是会执行成功,这是新手很容易忽视的。 即使是老手很多时候,很多时候因为忽视影响条数都可能出现难以排查的问题,比如update的子语句里面有not in的数值包含Null,有兴趣可以试试,很有意思。当然null的坑远不止这个,所以很多公司干脆规定字段要not null。

来自酷炫的 CNodeMD

@zy445566 好的。谢谢

@jacksparrow68 我一开始想用sequelize来着,但是看它还要定义model,然后查询感觉很麻烦,代码很多就放弃了。我去了解一下,谢谢了~

@zy445566 你好,突然想到一个问题,如果在一个事物里同时更新三条数据的话,像您说的假如一条没更新,不会出现异常然后自动回滚吗。这条更新的语句没执行成功是为什么

@DavidLuman 这条数据的值不对,或被别人更新了呢?这样这条更新的影响行数不就是0.不就没执行成功

@zy445566 值不对不就抛异常了么。如果被别人更新的话,那么事务里的这条语句应该还是会执行吧,即使这条语句改变完数据值还是一样,传回来的affectedRows还是为1。 我刚试验了一下,是不是您说的情况是在数据库里执行语句,同样的update语句,用node的mysql执行,无论多少次修改,返回的affectedRows一直是1,而在navicat里执行,第一次受影响的行为1,之后全为0,因为第一次改了数据。

@DavidLuman 。。。如果update的时候where一个没有的值,事务会执行失败? 我也没有说别人更新在你这个事务中操作啊,如果别人在之前把你的where条件更新,如果不检查影响条数,事务还不是能执行成功。

来自酷炫的 CNodeMD

回到顶部