在数据库中插入新记录之前,如何检查数据库表中是否存在相同的记录?如果存在,则应该抛出错误消息。
我的插入代码:
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();
答案 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.";
}
除了此检查之外,我仍然建议您使用唯一约束,这样当用户尝试在不使用您的工具/脚本的情况下将重复数据直接插入数据库时,它仍会被捕获