两种方案:
1.先查询具有唯一约束的字段是否已存在将插入的值,再决定是否进行插入操作
2.直接进行插入操作,根据是否有报唯一约束异常来返回插入成功或者某些字段重复的信息
从优化上讲,方案1更合适,但如果具有唯一约束的字段不止一个时,查询过程就会及其耗时。
这两种方案是否根据使用场景选择?另方案2如何提取数据库返回的唯一约束异常,如返回具体的重复字段为哪个?
两种方案:
1.先查询具有唯一约束的字段是否已存在将插入的值,再决定是否进行插入操作
2.直接进行插入操作,根据是否有报唯一约束异常来返回插入成功或者某些字段重复的信息
从优化上讲,方案1更合适,但如果具有唯一约束的字段不止一个时,查询过程就会及其耗时。
这两种方案是否根据使用场景选择?另方案2如何提取数据库返回的唯一约束异常,如返回具体的重复字段为哪个?
本质上只有方案2能够解决数据重复的问题
方案1只是一个尽量减少重复数据撞库的方案。在并发场景下,方案1即使在根据唯一约束字段查询时没有查出相关数据,进行插入操作的时候依然可能会抛出字段重复的异常。
所以方案2必须使用,方案1可以结合使用
正常来说,如果你的唯一约束字段做了索引,再加读写分离的话,这个效率是可以的,所以方案一没什么问题,也是相对比较主流的方案。
至于方案二,一般框架本身也提供了sql的异常,捕获一下打印可以了。
对于是否根据实际场景使用,一般来说,如果你的唯一性约束重复几率不高,直接插入,捕获异常就行,反之则提前校验。但是在实际应用上,一般都是采用方案一,不过一般异常捕获也会做。
此外,如果对于数据严谨性要求没有那么高,可采用的方案还有使用replace into/insert ignore,对于重复数据,前者替换,后者忽略。
4 回答1.6k 阅读✓ 已解决
4 回答1.3k 阅读✓ 已解决
8 回答1.3k 阅读
1 回答2.6k 阅读✓ 已解决
3 回答1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答2k 阅读
当然两个方式都用了。
比如注册场景,
方案1是为了友好提示:
您的手机号已被注册,请直接登录
等等~方案2是为了避免出现一些代码逻辑上的问题,以及一些高并发的场景,导致数据库出现重复数据。
唯一约束能在根源上保证数据唯一。