【发布时间】:2013-04-12 13:11:02
【问题描述】:
我正在尝试自动填充 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)";
}
【问题讨论】:
-
为什么?这在简单的 SQL 中完全是微不足道的。这是您打算稍后扩展为真正有用的工具的测试或演示吗?另外:您要问的问题是什么? PostgreSQL 版本? Perl 版本?平台? 任何错误消息的确切文本?近距离投票“不是一个真正的问题”。
-
当
$loop已经由您的for循环管理时,您为什么还要my $loop++;?为什么不使用$dbh->prepare和占位符呢?在 INSERT 中指定列是个好主意。 -
在 SQL 中执行此操作:
CREATE TABLE demo(id serial primary key, randnum float);然后insert into demo(randnum) select random() from generate_series(1,100);。 (如果愿意,您可以使用generate_series来提供 ID,而不是使用序列生成的 ID)。在单个 SQL 查询中执行此操作将比在 Perl 中循环快大大。尽可能避免循环 SQL 调用。 -
@Craig Ringer:我需要根据我提供的参数获取 ID。如果它是重复值,则可以。我正在尝试自动填充表格。尝试测试。
-
@user2272525 然后
insert into demo(id, randnum) select x, random() from generate_series($start,$start+$count) x;并将id列定义为integer而不是serial。
标签: perl postgresql