zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SQL server 插入不同IP的数据库
    SQL Server中的循环例子(网摘)
    C#小型数据库只能查询
    vue.prototype和vue.use的区别和注意点
    Ajax+PHP简单入门教程
    smarty在windows下的安装
    docker安装mysql镜像和容器
    Linux导出未越狱Iphone10.3QQ聊天记录
    记一次Struts中文乱码
    Ubuntu设置服务开机启动
  • 原文地址:https://www.cnblogs.com/dll102/p/14713470.html
Copyright © 2011-2022 走看看