表中有两个字段,分别是a,b。
例如记录如下1,21,32,31,3
说明:1.其中1,3才是重复的数据。2.表里面是允许重复数据存在。
问题:当用户选择重复的数据不添加入库,这时如果用户添加的数据如下。
2,31,41,3
只能让1,4插入,其余都不可以,怎么实现这个需求?麻烦了
认证高级PHP讲师
这个问题比较好解决哈,使用乐观锁吧,步骤如下:1.创建(1,3)元组的的md5 hash key(hashedKey)到redis里面,第一次查询时把对应的记录放到redis里面去;2.插入记录时,先插入新的(1,3)元组的md5 hash key到redis里面(乐观锁机制),如果不能插入,证明已经存在此key,拒绝进行此插入操作;3.hash算法例子如下:
function goHashed($a,$b,&$hashedKey) { //注意对a,b数据格式的判断和异常考虑 const SALT = "Hello,world" $hashedKey = md5($a.SALT.$b.SALT) }
===好好看了一下题主的问题,貌似还必须得用MySQL的方式解决===
如果不使用索引,本人还真没什么好办法,不过要是可以建索引的话,可以让a->b组成一个索引表的一个字段,索引类型为unique index,这样也能解决重复插入的问题。
使用唯一约束的目的是在数据库层进行重复数据的限制.
这里如果你要放弃这个限制的话,那么我们只能通过程序的方式来避免了.
最直接的解决方案就是,在插入数据之前,我们先搜索数据,判断下这个需要考虑唯一性的字段是否已经存在即将更新进去的值.如果存在,则放弃更新,否则执行更新操作.BUT,这个还是不能很号的避免重复数据的录入,毕竟还是存在那种高并发重复数据录入的情况. 只能是说大大的降低了重复数据录入的概率.
建议,能使用唯一约束的情况,还是尽量有唯一约束保证,这毕竟是系统的最后一层保障了.
这个问题比较好解决哈,使用乐观锁吧,步骤如下:
1.创建(1,3)元组的的md5 hash key(hashedKey)到redis里面,第一次查询时把对应的记录放到redis里面去;
2.插入记录时,先插入新的(1,3)元组的md5 hash key到redis里面(乐观锁机制),如果不能插入,证明已经存在此key,拒绝进行此插入操作;
3.hash算法例子如下:
===好好看了一下题主的问题,貌似还必须得用MySQL的方式解决===
如果不使用索引,本人还真没什么好办法,不过要是可以建索引的话,可以让a->b组成一个索引表的一个字段,索引类型为unique index,这样也能解决重复插入的问题。
使用唯一约束的目的是在数据库层进行重复数据的限制.
这里如果你要放弃这个限制的话,那么我们只能通过程序的方式来避免了.
最直接的解决方案就是,在插入数据之前,我们先搜索数据,判断下这个需要考虑唯一性的字段是否已经存在即将更新进去的值.如果存在,则放弃更新,否则执行更新操作.BUT,这个还是不能很号的避免重复数据的录入,毕竟还是存在那种高并发重复数据录入的情况. 只能是说大大的降低了重复数据录入的概率.
建议,能使用唯一约束的情况,还是尽量有唯一约束保证,这毕竟是系统的最后一层保障了.