2

我需要使用 Perl 和 DBI 在 MySQL 中执行查询并将结果插入另一个表中。第二个表是动态创建的,以定义与原始查询返回的字段数相同的字段,再加上一个字段。

我无法提前知道第一个查询或它将返回多少个字段。所以我正在做这件非常丑陋的事情(总结):

# Execute the received query
my $sth = $dbh->prepare($received_sql);
$sth->execute;

# Get the fields names and create the new table
my @fields = @{$sth->{NAME}};
my $create_table = "...some sql and a map from @fields...";

# Start getting the results from the query one by one just to insert them into the new table
while (my @record = $sth->fetchrow_array) {
    my $sql = "insert into `new_table` (";
    $sql .= join ', ', map { "`$_`" } @fields;
    $sql .= ") values (";
    $sql .= join ', ', map { '?' } @fields;
    $sql .= ')';
    my $insert = $dbh->prepare($sql)
    $insert->execute(@record);
}

如果我能做到这一点就完美了:

insert into `new_table` (...) select (...) from ...

但是,我需要知道从第一个查询返回的字段的名称,并在向其中插入数据之前创建相应的表。

所以,我一直想知道,因为$sth是一个实际的准备好的语句......无论如何都可以使用它来告诉 MySQL 将该语句的结果插入到另一个表中,而不是让它逐个记录地传递给 Perl?

提前感谢您的评论。

弗朗西斯科

4

2 回答 2

4

如果您不想指定每个字段,则可以使用如下语句:

  • CREATE TABLE newtable LIKE oldtable (并可能ALTER TABLE在此之后使用添加新字段)
  • INSERT INTO newtable SELECT * FROM oldtable
  • CREATE TABLE AS [$received_sql]
于 2013-04-30T14:37:03.273 回答
0

这个答案实际上来自@eggyal(作为评论留下),但后来他删除了答案,再也没有回来。

无论如何,我想分享他的答案,因为它非常有用。也许事情太简单了,但我只是不知道我可以这样做:

create table `new_table` select * from `other_table`

我什至可以做类似的事情:

create table `new_table` select SQL_CALC_FOUND_ROWS * from `other_table` limit 50;
select found_rows();

这简直太棒了!

速度很好,我什至不需要担心字段数据类型,MySQL会根据传递的查询自动完成。

@eggyal:如果您回到这篇文章,请随时添加您的答案,我会选择它。谢谢你的评论!

弗朗西斯科

于 2013-04-30T21:04:17.373 回答