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

时间:2013-12-18 10:29:05

标签: sql perl dbi sql-insert

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

我的插入代码:

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();

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

为数据库表添加唯一约束或索引。这个的确切语法取决于您使用的DBMS。例如,对于SQLLite,这可能是这样的:

CREATE UNIQUE INDEX backlogs_uc1 ON backlogs(backlogtype, parent_id, start_date);

确切地说,哪些列包含在您的约束中取决于您的数据库设计 - 您希望列自然地标识每一行。

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

答案 2 :(得分:0)

如果你不能添加约束,这里有一个例子 预选择。

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

use DBI;

# use test; create table x ( y int not null unique );
my $dsn = "DBI:mysql:database=test;host=localhost";
my $dbh = DBI->connect($dsn, DBUSER, DBPASS);

my $sth_select = $dbh->prepare("select count(*) from x where y=?");
my $sth_insert = $dbh->prepare("insert into x (y) values (?)");

for my $i (0..9) {
    my $val = int(rand(3));
    if ($dbh->selectrow_array($sth_select, undef, $val) > 0) {
        warn "[line $i] skipped duplicate entry $val\n";
    }
    else {
        $sth_insert->execute($val);
    }
}

答案 3 :(得分:0)

您可以通过使用与此类似的代码来检查是否存在并抛出错误:

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.";
}

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