如何获得使用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”语句。
答
SELECT i.*
FROM sysobjects o, sysindexes i
WHERE o.name = $name
AND i.id = o.id
DBD :: Pg也实现了这一点。 – 2009-01-22 23:33:29