Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在数据库中插入新记录之前,如何检查是否存在相同的记录_Sql_Perl_Dbi_Sql Insert - Fatal编程技术网

Sql 在数据库中插入新记录之前,如何检查是否存在相同的记录

Sql 在数据库中插入新记录之前,如何检查是否存在相同的记录,sql,perl,dbi,sql-insert,Sql,Perl,Dbi,Sql Insert,在数据库中插入新记录之前,如何检查数据库表中是否存在相同的记录?如果存在,那么它应该抛出一条错误消息 我的插入代码: my $sth = $dbh->prepare("INSERT into backlogs (backlogtype, name, startDate, endDate, parent_id) VALUES ('Iteration', '$iter', '" . $iterations{ $iter }->

在数据库中插入新记录之前,如何检查数据库表中是否存在相同的记录?如果存在,那么它应该抛出一条错误消息

我的插入代码:

my $sth = $dbh->prepare("INSERT into backlogs (backlogtype, name, startDate, endDate, parent_id) VALUES ('Iteration', '$iter', '" .
                                $iterations{ $iter }->{start} . " 08:00', '" .
                                $iterations{ $iter }->{end} . " 18:00', '" .
                                $project . "');");
$sth->execute() or die $DBI::errstr;
$sth->finish();

如果表中有任何像id这样的唯一约束,那么代码将自动抛出异常。您只需处理该异常并显示相应的消息/错误。

向数据库表添加唯一的约束或索引。具体语法取决于您使用的DBMS。例如,对于SQLLite,这将类似于:

CREATE UNIQUE INDEX backlogs_uc1 ON backlogs(backlogtype, parent_id, start_date);
约束中的具体列取决于您的数据库设计——您需要自然标识每一行的列


如果您这样做,那么现有的Perl将从数据库捕获唯一的约束异常,并打印数据库错误字符串。

如果您无法添加约束,下面是一个执行以下操作的示例 预选

免责声明:此方法受到竞争条件和并发性的影响 问题


您可以使用类似以下代码检查是否存在并抛出错误:

my $type = 'the_type';
my $name = 'the_name';

if ( $dbh->selectrow_array("SELECT COUNT(1) FROM backlogs WHERE backlogtype = '$type' and name = '$name'") ) {
    croak "Record with backlogtype '$type' and name '$name' already exists.";
}

除了此检查之外,我仍然建议使用唯一约束,以便当用户试图在不使用工具/脚本的情况下将重复数据直接插入数据库时,它仍将被捕获。

使用要插入的信息进行选择,并检查是否有结果目标表上是否有唯一的约束/索引?如果是这样,您的代码将自动抛出一条错误消息。@Kiwy PERL新手,我可以知道如何做吗?我将把它放在答案中。如果表中有
primary
键,DB会自动抛出错误。你能用select查询示例显示它吗?如果存在相同的记录,我如何检查并抛出错误?请看下面的两个答案。我可以知道croak是什么吗?@sammy,Carp's croak的行为类似于die,但提供了更多信息。更多详情请参见:和。在你的情况下,在审判中,你仍然可以用骰子代替呱呱叫。
my $type = 'the_type';
my $name = 'the_name';

if ( $dbh->selectrow_array("SELECT COUNT(1) FROM backlogs WHERE backlogtype = '$type' and name = '$name'") ) {
    croak "Record with backlogtype '$type' and name '$name' already exists.";
}