CNode

nodejs在做mysql判重的时候遇到的问题

问答
Lliming881227发布于12 年前最后回复12 年前19 回复5693 浏览0 收藏

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

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

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

性约束来做。。

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

查看回复

回复 (19)

L
liming881227#1·12 年前
引用 fish为什么不是mysql设置 字段 unique

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

F
fish#2·12 年前

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

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

a1+b1, c1
a2+b1, c1

...

A
alsotang#4·12 年前
引用 fishA+B unique , A+B+C unique, 能推到出 C unique 么? 推导不严密 有问题,不能通过拆分索引解决。。。 ...

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

L
liming881227#6·12 年前
引用 alsotang@fish 当 A+B unique 的时候,A + B + C 的这条复合索引不具备意义。

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

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

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

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

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

L
liming881227#12·12 年前
引用 alsotang@liming881227 噢,这样。那就 upsert 吧,遇到什么问题吗?

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

L
liming881227#14·12 年前
引用 alsotang@liming881227 http://dev.mysql.com/doc/refman/5.0/en/insert on duplicate.html 触发 duplicate key 的...

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

A
alsotang#15·12 年前
引用 liming881227@alsotang 不是主键也得有约束条件吧,我已经没法添加A+B的约束条件了

@liming881227

untitled1.png

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

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

L
liming881227#16·12 年前
引用 alsotang@liming881227 第一种和第二种,都需要有 A+B 的约束条件。 第三种用事务的方式,看来也只能这样了。

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

5
514366607#17·12 年前

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

F
fish#19·12 年前

为什么不是mysql设置 字段 unique

参与回复
登录后即可参与回复。登录