如何获得使用Perl的SQL表上的索引列表?

问题描述:

如何在使用Perl的sybase数据库中的表中获取索引列表?目标是将表格中的所有索引“复制”到几乎相同的表格中。如何获得使用Perl的SQL表上的索引列表?

$dbh->selectarray_ref('sp_helpindex $table')我能做的最好吗?

有一个在DBI一个statistics_info()方法,但不幸的是,唯一的DBD我已经看到了它在迄今实行的是DBD :: ODBC。所以如果你使用ODBC(update:或者PostgreSQL!),你很幸运。否则,sp_helpindex(或sysindexes表)的性能与Sybase相当。

下面是我用为Sybase(在我自己的OO模块 - 除非all_indexes说法是事实,就只返回唯一索引):

{ 
my $sql_t = <<EOT; 
select 
    sysindexes.name, 
    index_col(object_name(sysindexes.id), sysindexes.indid, syscolumns.colid) col_name 
from sysindexes, syscolumns 
where sysindexes.id = syscolumns.id 
    and syscolumns.colid <= sysindexes.keycnt 
    and sysindexes.id = object_id(%s) 
EOT 

sub index_info { 
    my ($self, $table, $all_indexes) = @_; 

    my $dbh = $self->{DBH}; 
    my $sql = sprintf $sql_t, $dbh->quote($table); 
    $sql .= "and sysindexes.status & 2 = 2\n" unless $all_indexes; 
    my $sth = $dbh->prepare($sql); 
    $sth->execute(); 
    my @col_names = @{$sth->{NAME_lc}}; 
    my %row; $sth->bind_columns(\@row{@col_names}); 
    my %ind; 
    while ($sth->fetch()) { 
    if ($row{col_name}) { 
     push @{$ind{$row{name}}}, lc($row{col_name}); 
    } 
    } 
    return unless %ind; 
    return \%ind; 
} 

} 

或者,如果你的目标是把刚才复制指数,也许你应该得到dbschema.pl实用程序(它使用Sybase :: DBlib)。它将为您生成“CREATE INDEX”语句。

+0

DBD :: Pg也实现了这一点。 – 2009-01-22 23:33:29

SELECT i.* 
FROM sysobjects o, sysindexes i 
WHERE o.name = $name 
    AND i.id = o.id