如果主键已在表中,则跳过SQLite操作

时间:2013-09-10 08:40:40

标签: database perl sqlite

我已经使用JSON API中的数据哈希填充了一个数组,我希望将其加载到SQLite表中。生成此表的(复合)主键,以便稍后的JSON pull不包含与旧主键关联的任何新信息,但/将包含具有新主键的新信息。 (具体来说,它的关键是日期和唯一标识我需要信息的每个对象的ID的组合。)

除了不得不笨拙地使用API​​参数之外,我宁愿让程序丢弃信息已经在上面给出的表中,但是我无法正确跳过循环。

use DBI;
use 5.010;

#DLing information, processing, sanitising, etc. omitted

foreach my $hash (@{$data{$key}}) {
    my %data = %{$hash->{'row'}};
    my $date = $data{'date'};
    my $id = $data{'id'};
    my @pkey = [$date, $id]; #Generate a Perl array corresponding to the primary key, e.g. ['2013-09-10','0001']
    next if @pkey ~~ @allkeys; #Trying to use the 5.010 smart match operator to check if primary key already processed, and skip the entry if it is
    push(@allkeys,[@pkey]); 
    #Other stuff omitted--nothing to do with the pkey issue#
    my $sql = sprintf "INSERT INTO %s (date,id,low,high,avg) VALUES ('%s', %s, %s, %s, %s)",
        $table, $date, $id, $low, $high, $avg; #Values initialised earlier in script
    $dbh->do($sql);
}

这就是我现在正在尝试的东西,但它仍然在第一次操作时死亡;更简单的是让循环跳过特定的错误类型'DBD :: SQLite :: db do failed:columns date,typeID不是唯一的'而不是死亡,但我没有最模糊的地方开始。< / p>

为完整起见,数据库架构:

CREATE TABLE table (
            date TEXT,
            id INTEGER,
            low REAL,
            high REAL,
            avg REAL,
            PRIMARY KEY (date,id)
    );

1 个答案:

答案 0 :(得分:3)

要不插入违反UNIQUE约束的记录,请使用INSERT OR IGNORE

INSERT OR IGNORE INTO TheRealTableName(date,id,low,high,avg) VALUES (?,?,?,?,?)