delphi中 怎么判断表中是否已经存在主键 和索引

解决方案 »

  1.   


      with adoquery1 do
      begin
        close;
        sql.text:= 'exec sp_pkeys yourtablename';
        open;
        if recordcount <> 0 then showmessage('有');
        close;
      end;
    手写,未测,应该没什么问题
      

  2.   

    同理用exec sp_statistics可取得索引相关
    exec sp_statistics table1
      

  3.   

    select * from TableName where index_field_name = [要插入记录的唯一索引字段值] 
    如果记录数大于0,则表示表中已存在该索引 
      

  4.   

    查看一下sysobjects 的 xtype對就相關表的屬性. xtype= 'D' 表示indexif exists(select * from sysobjects where name='%table%' and xtype='PK')  
      

  5.   

    sql中可使用sp_pkeys:with ado1 do
      begin
        close;
        sql.text:= 'exec sp_pkeys res_hr_rsqj ;
        open;
        if recordcount > 0 then showmessage('存在PK');
        close;
    ......
      end;
      

  6.   

    sql中還可以這樣: 
    2:利用系統表INFORMATION_SCHEMA.KEY_COLUMN_USAGE   SELECT   TABLE_NAME,COLUMN_NAME   FROM   INFORMATION_SCHEMA.KEY_COLUMN_USAGE   
    WHERE   TABLE_NAME= '表名 ' 3:   以下這個查詢表結構的語句可能大家都見過: 利用syscolumns,sysindexes,sysindexkeys三個表關聯可以查出主鍵 SELECT   
      (case   when   a.colorder=1   then   d.name   else   ' '   end)   N '表名 ', 
      a.colorder   N '欄位序號 ', 
      a.name   N '欄位名 ', 
      (case   when   COLUMNPROPERTY(   a.id,a.name, 'IsIdentity ')=1   then   '√ 'else   ' '   end)   N '標識 ', 
      (case   when   (SELECT   count(*) 
      FROM   sysobjects 
      WHERE   (name   in 
                          (SELECT   name 
                        FROM   sysindexes 
                        WHERE   (id   =   a.id)   AND   (indid   in 
                                            (SELECT   indid 
                                          FROM   sysindexkeys 
                                          WHERE   (id   =   a.id)   AND   (colid   in 
                                                              (SELECT   colid 
                                                            FROM   syscolumns 
                                                            WHERE   (id   =   a.id)   AND   (name   =   a.name)))))))   AND 
                    (xtype   =   'PK '))> 0   then   '√ '   else   ' '   end)   N '主鍵 ', 
      b.name   N '類型 ', 
      a.length   N '佔用位元組數 ', 
      COLUMNPROPERTY(a.id,a.name, 'PRECISION ')   as   N '長度 ', 
      isnull(COLUMNPROPERTY(a.id,a.name, 'Scale '),0)   as   N '小數位數 ', 
      (case   when   a.isnullable=1   then   '√ 'else   ' '   end)   N '允許空 ', 
      isnull(e.text, ' ')   N '預設值 ', 
      isnull(g.[value], ' ')   AS   N '欄位說明 ' 
    --into   ##tx FROM     syscolumns     a   left   join   systypes   b   
    on     a.xtype=b.xusertype 
    inner   join   sysobjects   d   
    on   a.id=d.id     and     d.xtype= 'U '   and     d.name <> 'dtproperties ' 
    left   join   syscomments   e 
    on   a.cdefault=e.id 
    left   join   sysproperties   g 
    on   a.id=g.id   AND   a.colid   =   g.smallid     
    order   by   object_name(a.id),a.colorder 
    4: 
    select   o.name   as   表名,c.name   as   欄位名,k.colid   as   欄位序號,k.keyno   as   索引順序   from   sysindexes   i 
    join   sysindexkeys   k   on   i.id   =   k.id   and   i.indid   =   k.indid 
    join   sysobjects   o   on   i.id   =   o.id 
    join   syscolumns   c   on   i.id=c.id   and   k.colid   =   c.colid 
    where   o.xtype   =   'U ' 
    and   exists(select   1   from   sysobjects   where   xtype   =   'PK '   and   name   =   i.name) 
    order   by   o.name,k.colid