nodejs在做mysql判重的时候遇到的问题
发布于 10 年前 作者 liming881227 5151 次浏览 最后一次编辑是 8 年前 来自 问答

如果,同时接收到N条数据,将N条数据存入数据库,此时需对N条数据进行数据库 某些字段 判重,如果数据库已有该数据,则不插入。

遇到的问题就是,假如1和2是相同数据,在做1和2查询数据库相同记录时,都返回没有,因此1和2就都插入数据库了。这不是想要的状态

像JAVA的话多线程,可以在查询数据库相同记录时做同步操作,而nodejs是单线程,没有加锁的概念,而且数据库已经有唯一性约束了,不能通过唯一

性约束来做。。

想问各位大神,有遇到这种情况是怎么解决的吗?

19 回复

为什么不是mysql设置 字段 unique

@fish 数据库已经有A,B,C的字段unique了,此时我还想针对A,B进行判重。

A+B unique , A+B+C unique, 能推到出 C unique 么?

推导不严密~ 有问题,不能通过拆分索引解决。。。

a1+b1, c1
a2+b1, c1

@fish 当 A+B unique 的时候,A + B + C 的这条复合索引不具备意义。

@alsotang 现在是A+B+C unique, 比如标题 + 内容 + 发布时间 可是如果两条数据 标题 + 内容是一样的,只是发布时间不一样。 这样我想判重。

@alsotang 这个好像不能啊 ON DUPLICATE KEY

@fish 现在目前 是A+B+C unique 在此基础上我还想做A+B unique

@liming881227 我还不是不懂你的具体场景。 我觉得吧,既然 标题和内容 已经可以判定唯一了,那就做个 A+B 的 unique 就好了。

@alsotang 现在是有一部分数据我是想做A+B+C的unique,有一部分数据是想做A+B的unique。因此我就想沿用A+B+C的 对于A+B的unique,我在插入的时候来判断。

@liming881227 噢,这样。那就 upsert 吧,遇到什么问题吗?

@alsotang 用upsert的话不是检测 on DUPLICATE key , 可是我的主键是id,自增的, 这样的话也不会存在重复主键了啊。我现在就是想单纯地通过查询mysql判重

@alsotang 不是主键也得有约束条件吧,我已经没法添加A+B的约束条件了

@liming881227

untitled1.png

第一种和第二种,都需要有 A+B 的约束条件。

第三种用事务的方式,看来也只能这样了。

@alsotang 我也想到事务了,先用事务试试吧,nodejs在这方面还挺弱的。

你这个问题原本就有问题,mongodb不敢说,因为不太懂。。 A+B+C unique = A(unique) && A,B(unique) && A,B,C(unique) 在你的应用场景里完全浪费索引空间,标题 + 内容 + 发布时间这样的结构"发布时间"还要做唯一不是蛋痛没事做吗,还不如做A+B unique。

@liming881227 这个问题就像手拿着鸡蛋只想吃蛋黄,然后就说鸡为什么不生只有蛋黄的鸡蛋。

回到顶部