删除并重建主键

  可以参考以下步骤删除并重建SinoDB数据库表中的主键:

  1. 查出主键的约束名称:
select constrname from sysconstraints 
  where tabid in (select tabid from systables where tabname=‘t8’) 
   and constrtype ='P' ;

/*
constrtype:
'P' 是主键约束
C 检查约束(Check)
R 引用(外键)(Reference,Foreign Key)
U 唯一约束 (Unique)
N 非空(Not Null)
*/
  1. 删除主键
-- tabname为表名,u217_138为上一步查出的约束名
alter table t8 drop constraint u217_138;
  1. 创建主键
alter table t8 add constraint primary key(cid) constraint pk_t8;

  实际上使用约束关键字来创建主键,动态服务器会自动创建对应的索引,并为指派一个系统编号,并将该编号用作索引名,但对开发人员跟设计人员而言,不具备可读性,而且直接删除该索引会提示错误:

> select idxname,part1 from sysindexes where tabid=217;

idxname   217_138
part1    1

1 row(s) retrieved.

> drop index 217_138;

  201: A syntax error has occurred.
Error in line 1
Near character position 12

  而且,使用约束关键字方式生成的索引,默认创建在数据所在dbspace中,因此可能会对数据库总体性能产生负面影响。此外,由于在删除该表的主键或外键约束时,将自动删除这些索引,后续如果需要在查询中使用这些索引,则需要重新创建它们。如果表中有数百万行,那么可能是一个十分耗时的过程。因此,在表中创建或添加主键约束的建议方式如下:

  • 创建不含约束键字的表。
  • 在将使用约束的列上创建索引
  • 更改表来添加约束
> drop table t8;

Table dropped.

> create table t8(cid int,cname varchar(30)) in datadbs1;

Table created.

> create unique index idx_u_t8 on t8(cid) in idxdbs;

Index created.

> alter table t8 add constraint primary key(cid) constraint pk_t8;

Table altered.

> select constrname from sysconstraints where tabid in (select tabid from systables where tabname='t8');

constrname  pk_t8

1 row(s) retrieved.


> select idxname from sysindexes where tabid=218;

idxname  idx_u_t8

1 row(s) retrieved.

> 

在以上示例中,您可以在不同的数据库空间(dbspace)中放置索引和数据,以提高表的性能。