怎么查数据库数据不重复

问:SQL 查询表中某一字段不重复的所有数据
  1. 答:1、创建测试表,
    create table test_dis(id number, name varchar2(20), value number(10));
    2、插入测试数据
    insert into test_dis values(1,'a',123);
    insert into test_dis values(2,'b',152);
    insert into test_dis values(3,'c',123); 
    insert into test_dis values(4,'d',520);
    insert into test_dis values(5,'e',300);
    commit;
    3、查询表中全量数据,select t.*, rowid from test_dis t;
    4、编写sql,查询表中某一字段不重复的所有数据,可以发现只有id为2,4,5的记录查询出。
       select * from test_dis t where value in (select value from test_dis group by value having count(*)=1);
问:sql 查询数据表后 在统计某一列数据不重复的数量
  1. 答:统计第一列不相同的个数的操作方法和步骤如下:
    1、首先,创建测试表,代码如下图所示。
    2、其次,完成上述步骤后,插入测试数据,代码如下图所示。
    3、接着,完成上述步骤后,创建所需临时表,代码如下图所示。
    4、最后,完成上述步骤后,统计每一列不重复的数据量,如下图所示。这样,问题就解决了。
问:如何保证多线程从mysql数据库查询的数据不重复
  1. 答:以mysql来说,可能出现脏读、不可重复读以及幻读,mysql默认设置是可重复读,即一次事务中不会读取到不同的数据。
    可以做如下操作:
    1)打开两个客户端,均设置为RR;
    2)在一个事务中,查询某个操作查到某份数据;比如是某个字段version=1存在数据;
    3)在另一个事务中,删除这份version=1的数据;删除后,在2所属的事务中查询数据是没有变化的,还是存在version=1的数据;
    4)当我们在2所属的事务中继续更新数据,那么会发现更新不了,明明我们就看到了这份version=1的数据;
    缓存一致性:
    缓存一致,与什么一致?是与数据库一致,对外查询每个时刻一致;所以在针对于缓存与数据库之间该先更新哪一个呢?可能有人觉得我先更新数据库,再更新缓存不就行了吗?但是有想过个问题吗?
    当用户已经支付成功了,更新到数据库,但是呢?你还在缓存中显示未支付,在用户点击频率很高并且数据库压力过大,来不及同步到缓存时,那你是不是很尴尬,这就是典型的不一致了。此时用户再支付,那你又告诉他已经支付了,那他会把你骂死的
    那该怎么来做呢?我们可以这样,先更新缓存再更新数据库,那么存在什么问题呢?
    1)缓存更新成功,但是数据库更新失败,而被其它的并发线程访问到
    2)缓存淘汰成功,但是数据库更新失败,这也会引发后期数据不一致

猜你喜欢