Sybase获取所有主键和索引,并删除
如果只是查看sybase中的索引和主键,可以用sp_helpindex系统存储过程。
如果想删除特定名称的主键和索引,可以直接写drop语句和alter table语句。
如果想动态的删除sybase数据库中的索引和主键,则需要用到一下几个表
sysobjects每个数据库中都有
每个表、视图、存储过程、扩展存储过程、日志、规则、缺省值、触发器、检查约束、参照约束、计算列、基于函数的索引键和(仅在 tempdb中)临时对象以及其它形式的编译对象在 sysobjects 中都有相应的一行。对象 type 为 N 时,每个分区条件 ID 在 sysobjects 中也都有相应的一行。
主要字段有:
name varchar(255) not null 对象名
id int 对象 ID
uid int 对象所有者的用户 ID
type char(2) 可以为以下对象类型之一:
C – 计算列
D – 缺省值
F – SQLJ 函数
L – 日志
N – 分区条件
P – Transact-SQL 或 SQLJ 过程
PR – 准备对象(由 Dynamic SQL 创建)
R – 规则
RI – 参照约束
S – 系统表
TR – 触发器
U – 用户表
V – 视图
XP – 扩展存储过程
sysindexes
每个聚簇索引、每个非聚簇索引、每个没有聚簇索引的表和每个包含 text 或 image 列的表在 sysindexes 中都有相应的一行。该表对于每个基于函数的索引或在计算列上创建的索引也都有相应的一行。
主要字段有:
name varchar(255)
null
索引或表名
id int 索引的 ID 或索引所属的表的 ID
indid smallint
• 0 — 如果是表
• 1 — 如果是所有页锁定表上的聚簇索引
• >1 — 如果是 DOL 锁定表上的非聚簇索引或聚簇索引
• 255 — 如果是 text 、image 、文本链或 Java 行外结构(大对象,即
LOB 结构)
status smallint 内部系统的状态信息
其中status列的相关说明如下:
1、官方文档
十进制
十六进
制状态
10×1如果试图插入重复键,则中止当前命令或触发器
20×2唯一索引
40×4如果试图插入重复行,则中止当前命令或触发器;对于 DOL 锁定表,则始终为 0
16 0x10 聚簇索引
64 0x40 如果是所有页锁定表,索引允许重复行;如果是 DOL 锁定表,则始终为 0
128 0x80 已排序的对象;对于没有聚簇索引的表或文本对象,则不设置
512 0x200
create index 语句中使用的 sorted data 选项
2048 0x800 对主键的索引
32768 0x8000 可疑索引;使用另一种排序顺序创建索引
2、谷歌结果
case when i.status = 0 then ‘普通索引’
when i.status = 2 then ‘唯一索引’
when i.status = 16 then ‘聚簇索引’
when i.status = 2048 then ‘主键索引’
when i.status = 2050 then ‘主键唯一索引’
when i.status = 2066 then ‘‘
when i.status = 16402 then ‘聚簇唯一索引’
when i.status = 2097152 then ‘有字段允许为空的普通索引’
when i.status = 2097154 then ‘有字段允许为空的唯一索引’
好像主键的条件是status&2048=2048,而这个规则在多个DBMS中都适用,比如MS SQL SERVER和mysql
附上完整SQL
declare @TABLE_NAME varchar(50)
set @TABLE_NAME=’ht_authlog_t1′
while 1=1
begin
declare @PK_NAME varchar(50)
set @PK_NAME=null
declare @sql varchar(1000)
set @sql=null
select @PK_NAME=name from sysindexes where indid>0 and indid<255 and status&2048=2048 and id in
(select id from sysobjects where name=@TABLE_NAME)
if @PK_NAME is null
begin
print ‘pk name is null’
break
end
else
begin
print ‘pk name is not null’
print @PK_NAME
select @sql=’alter table ‘+@TABLE_NAME+’ drop constraint ‘+@PK_NAME
exec(@sql)
end
end
go
—————————————————————————-
declare @TABLE_NAME varchar(50)
set @TABLE_NAME=’ht_authlog_t1’
while 1=1
begin
declare @INDEX_NAME varchar(50)
set @INDEX_NAME=null
declare @sql varchar(1000)
set @sql=null
select @INDEX_NAME=name from sysindexes where indid>0 and indid<255 and status&2048!=2048 and id in
(select id from sysobjects where name=@TABLE_NAME)
if @INDEX_NAME is null
begin
print ‘index name is null’
break
end
else
begin
print ‘index name is not null’
print @INDEX_NAME
select @sql=’drop index ‘+@TABLE_NAME+’.’+@INDEX_NAME
exec(@sql)
end
end