1

我正在尝试在 PostgreSQL 数据库中自动填充表。不幸的是,我没有让插入语句起作用。

第一行是一个整数 ID,第二列是数字数据类型。我正在使用 Perl 脚本来实现这一点。

我正在使用rand创建 0 到 1 之间的随机数的函数。第一个参数是变量$id;第二个参数是变量$count

根据计数,该表将填充 ID,后跟一个随机数。

我正在使用 PostgreSQL 9.2.4。

-ID | Random_Number
-1 |  0.01
-1 |  0.03
-2 |  0.0566

#!/usr/bin/perl

use DBI;

my $id = <>;
my $count = <>;

my $db_host = 'localhost';
my $db_user = 'postgres';
my $db_pass = '12345';
my $db_name = 'postgres';

my $db = "dbi:Pg:dbname=${db_name};host=${db_host}";

$dbh = DBI->connect($db, $db_user, $db_pass, { RaiseError => 1, AutoCommit => 0 })
        || die "Error connecting to the database: $DBI::errstr\n";

for (my $loop = 0; $loop < $count; $loop++) {
    my $random_number = rand();
    my $loop++;
    my $query = "insert into random_table values($loop,$random_number)";
}
4

2 回答 2

2

这是不必要的复杂。只是:

CREATE TABLE random_table(id integer, random_value float);

然后:

my $dbh = DBI->connect($db, $db_user, $db_pass,{ RaiseError => 1, AutoCommit => 0 })
my $sth $dbh->prepare("INSERT INTO random_table(id,random_value) SELECT x, random() FROM generate_series(?,?);")
my $result = $sth->execute(0, $count);

(未经测试,但我很确定这是正确的)。

顺便说一句,你真的需要:

use strict;
use warnings;
use 5.10.1; // or whatever the oldest Perl you support is

在你的脚本中。

于 2013-04-12T00:56:18.263 回答
1

首先,您要重新声明 $loop 变量,这将掩盖其先前的声明。由于 ++ on an undefined value = 1,$query 中的 $loop 每次都是 1。

for(my $loop=0; $loop < $count;$loop++)
{
  my $random_number = rand();
  my $loop++; # Shouldn't be here
  my $query = "insert into random_table values($loop,$random_number)";
}

如果你在 perl 上打开了警告,就会警告你这一点。

其次,您没有对 $query 做任何事情。这只是一个字符串。你必须执行它,例如$dbh->do($query)。

于 2013-04-12T01:13:55.890 回答