Trafodion 删除重复记录

在Trafodion中,一个重要的概念叫“聚集键”,“聚集键”是定义了Trafodion按哪一个字段或几个字段顺序存储。“聚集键”一般使用PRIMARY KEY(a,b,c)或STORE BY(a,b,c)语法定义,PRIMARY KEY与STORE BY唯一的区别在于是否具有行唯一性。

“聚集键”经过一定的编码转换后对应HBase的ROWKEY,“聚集键”是唯一的。如果表上定义了PK,那么PK的唯一性保证了“聚集键”的唯一性,如果表上没有定义PK,那么系统会自动在表上添加一个“SYSKEY”,用于保证行的唯一性。

下面例子分别创建两个表Table_a和Table_b,其中Table_a有主键,而Table_b没有,用INVOKE命令可以查看到Table_b上自动创建一个SYSKEY的隐藏列,它具有行唯一性。

>>create table table_a(a int not null, b int) primary key (a);

--- SQL operation complete.
>>create table table_b(a int not null, b int) store by (a);

--- SQL operation complete.
>>invoke table_a;

-- Definition of Trafodion table TRAFODION.SEABASE.TABLE_A
-- Definition current  Fri Jun 16 12:02:55 2017

  (
    A                                INT NO DEFAULT NOT NULL NOT DROPPABLE NOT
      SERIALIZED
  , B                                INT DEFAULT NULL NOT SERIALIZED
  )
  PRIMARY KEY (A ASC)

--- SQL operation complete.
>>invoke table_b;

-- Definition of Trafodion table TRAFODION.SEABASE.TABLE_B
-- Definition current  Fri Jun 16 12:03:01 2017

  (
    SYSKEY                           LARGEINT NO DEFAULT NOT NULL NOT DROPPABLE
      NOT SERIALIZED
  , A                                INT NO DEFAULT NOT NULL NOT DROPPABLE NOT
      SERIALIZED
  , B                                INT DEFAULT NULL NOT SERIALIZED
  )

--- SQL operation complete.

由于Table_a具有主键,主键约束保证了无法插入两个相同的行,而Table_b没有主键,虽然可以通过SYSKEY隐藏列来保证每一行是唯一的,但存储在表中的用户数据是无法保证唯一的。

>>insert into table_a values(1,2),(1,2),(1,3);

*** ERROR[8102] The operation is prevented by a unique constraint.

--- 0 row(s) inserted.
>>insert into table_b values(1,2),(1,2),(1,3);

--- 3 row(s) inserted.
>>select * from table_a;

--- 0 row(s) selected.
>>select * from table_b;

A            B
-----------  -----------

          1            2
          1            2
          1            3

--- 3 row(s) selected.

现在,Table_b就有两条同样的数据了,那么现在的需求是删除重复记录。删除重复记录有多种方法,这里我们利用SYSKEY的唯一来删除重复记录,这有点类似于利用Oracle中的ROWID,如下

>>delete from table_b where syskey not in (select min(b.syskey) from table_b b group by b.a,b.b);

--- 1 row(s) deleted.
>>select * from table_b;

A            B
-----------  -----------

          1            2
          1            3

--- 2 row(s) selected.

另外,提醒一下,如果是要在大量数据集上做删除操作,默认的DELETE FROM性能可能会不好,关于删除数据过慢的问题,可以参考我的另外一篇博客:http://blog.csdn.net/post_yuan/article/details/70238828

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据源的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值