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

Database 如果主键已在表中,则跳过SQLite操作,database,perl,sqlite,Database,Perl,Sqlite,我已经用JSON API中的数据散列填充了一个数组,我想将其加载到SQLite表中。生成此表的(复合)主键,以便稍后的JSON拉取不会包含任何与旧主键关联的新信息,而是/will/包含具有新主键的新信息。(具体地说,它由日期和唯一标识我需要信息的每个对象的ID组合设置。) 与其笨拙地摆弄API参数,不如让程序放弃上面给出的表中已有的信息,但我不能让循环正确地跳过 use DBI; use 5.010; #DLing information, processing, sanitising, et

我已经用JSON API中的数据散列填充了一个数组,我想将其加载到SQLite表中。生成此表的(复合)主键,以便稍后的JSON拉取不会包含任何与旧主键关联的新信息,而是/will/包含具有新主键的新信息。(具体地说,它由日期和唯一标识我需要信息的每个对象的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 not unique”,而不是终止,但我不知道从哪里开始

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

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

要不插入违反
唯一约束的记录,请使用:

在AltalEnableName(日期、id、低值、高值、平均值)中插入或忽略值(?,,?,?)

若要不插入违反
唯一约束的记录,请使用:

在AltalEnableName(日期、id、低值、高值、平均值)中插入或忽略值(?,,?,?)

始终这不是您的实际数据库模式;请修复错误。架构不正确:
typeID
不应该是
id
?啊,对不起;我会继续的。我重新命名了变量,以便在上下文之外更容易看到,但显然忽略了这一点。与严格使用和警告相同;省略它们是因为我认为它是给定的;请修复错误。架构不正确:
typeID
不应该是
id
?啊,对不起;我会继续的。我重新命名了变量,以便在上下文之外更容易看到,但显然忽略了这一点。与严格使用和警告相同;省略它们是因为我认为它是给定的。效果完美:干杯!SQL新手,对Perl没有太多经验,因此可能会有一个愚蠢的问题!SQL新手,对Perl没有太多经验,因此这个问题可能很愚蠢。