2

この 2 つのテーブルの間に perl を使用してリレーショナル テーブルを作成し、データを挿入したいと思います。

$create_query = qq{
    create table article(
        id_article int(10) auto_increment NOT NULL,
        url MEDIUMTEXT COLLATE utf8_general_ci,
        html_extr_text TEXT COLLATE utf8_general_ci,
        concord_file TEXT COLLATE utf8_general_ci,
        sys_time VARCHAR(50),
        primary key (id_article)
        )
};
$dbh->do($create_query);

 $create_query = qq{
     create table event(
         id_event int(10) auto_increment NOT NULL,
         event MEDIUMTEXT COLLATE utf8_general_ci,
         primary key (id_event)
         )
};
$dbh->do($create_query);

リレーショナル テーブルは次のようになります。

$create_query = qq{
    create table article_event_index(
        id_article int(10) NOT NULL,
        id_event int(10) NOT NULL,
        primary key (id_article, id_event),
        foreign key (id_article) references article (id_article),
        foreign key (id_event) references event (id_event)
        )
};
$dbh->do($create_query);

「article_event_index」テーブルを埋めるためにperlステートメントがどうあるべきか誰かが知っていますか? 他のテーブルでは、各テーブルに配列を使用します。次のようになります。

my $i_event;
my $id_event = 0;
my @event_index;
for ($i_event = 0; $i_event < @event_prepare; $i_event++){
    $dbh->do("
        INSERT INTO `event`(`id_event`, `event`)
        VALUES ('$id_event', '$event_prepare[$i_event]')
        ") || die $dbh->errstr;
    push @event_index, $i_event;
}
$id_event++;

この場合、'id_event' は $id_event のインクリメントによって生成されます。この ID をインデックス テーブルで再利用したい場合、これは良い方法ですか?

4

2 に答える 2

1

Dave Sherohman の応答に加えて、コードに関するいくつかのコメントを次に示します。

挿入に準備済みステートメントを使用することを検討する必要があります。

my $sth = $dbh->prepare("INSERT INTO `event`(`id_event`, `event`) VALUES (?,?)");

次に、ループで、挿入する必要がある行ごとにこれを行うことができます:

$sth->execute($id_event, $event_prepare[$i_event]);

これは、より単純で (引用符を自動的に処理します)、より安全で (SQL インジェクションを防ぎます)、高速です。

さらに、配列を処理するためだけに C スタイルの for ループを使用する必要はありません。次のいずれかのフォームを使用できます。

for my $i_event (0..$#event_prepare){
    #if you need the array index.
}

for my $event (@event_prepare) {
    #if you don't need the array index.
}

また、これは好みにすぎませんが{ ... } 、コード ブロックに似すぎているため、文字列の区切り記号としては好きではありません。

于 2013-03-13T12:10:45.683 に答える
0

id_eventフィールドは として定義されているためauto_increment、データベースに id 値を生成させることができます。これは、競合状態の可能性を回避するために通常行う方法です。(つまり、2 つの別々のユーザー/プロセスが同時に行を挿入しようとして、両方が同じ id 値を生成した場合、2 番目にコミットした方が失敗します。)

行を挿入した後last_insert_id、別のテーブルで外部キーとして使用する必要がある場合は、DBI のメソッドを使用して、新しい行の自動生成された id 値を取得できます。

my $id = $dbh->last_insert_id(undef, undef, 'event', 'id_event');
于 2013-03-13T09:04:09.493 に答える