如何检查mySQL DB中的值是否存在?
作者:互联网
我有一个mySQL数据库,并且有一个Perl脚本连接到该数据库并执行一些数据操作.
数据库中的表之一如下所示:
CREATE TABLE `mydb`.`companies` (
`company_id` INT NOT NULL AUTO_INCREMENT,
`company_name` VARCHAR(100) NULL ,
PRIMARY KEY (`company_id`) );
我想在此表中插入一些数据.问题是某些公司中的数据可以重复.
问题是:如何检查“ company_name”已经存在?如果存在,我需要检索“ company_id”并将其用于将数据插入到另一个表中.如果没有,那么应该在此表中输入此信息,但是我已经有了此代码.
这是一些其他要求:脚本可以同时运行多次,因此我不能只是将数据读入哈希并检查其是否已存在.
我可以抛出一个附加的“ SELECT”查询,但是它将在数据库上创建一个附加命中.
我试图寻找答案,但是这里的每个问题或Web上的线程都在谈论使用主键检查.我不需要这个数据库结构已经设置好,但是我可以根据需要进行更改.该表将用作附加表.
还有另一种方法吗?在DB和Perl中.
解决方法:
“脚本可以同时运行多次,所以我不能只是将数据读入哈希并检查其是否已经存在.”
听起来您最担心的是,脚本的一个实例可能会在另一个脚本运行时插入新的公司名称.当该公司名称不存在时,这两个脚本可能会检查数据库中是否存在该公司名称,然后它们都可能会插入数据,从而导致重复.
>假设我正确理解了您的问题,则需要查看事务.您需要能够检查数据并插入数据,然后再允许其他任何人检查该数据.这样可以防止脚本的第二个实例检查数据,直到第一个实例完成检查和插入为止.
检出:http://dev.mysql.com/doc/refman/5.1/en/innodb-transaction-model.html
并且:http://dev.mysql.com/doc/refman/5.1/en/commit.html
MyISAM不支持交易. InnoDB确实如此.因此,您需要确保您的表是InnoDB.使用START TRANSACTION开始您的查询集.
>或者,如果在company_name上具有唯一索引(您应该这样做),则可以执行此操作.
$query_string = "INSERT INTO `companies` (NULL,'$company_name')";
如果company_name已经存在,这将导致错误.尝试运行示例以尝试插入重复的公司名称.在PHP中,
$result = mysql_query($query_string);
错误时$result将等于false.所以,
if(!$result) {
$query2 = "INSERT INTO `other_table` (NULL,`$company_name`)";
$result2 = mysql_query($query2);
}
如果您在两个表中的company_name上都具有唯一键,则MySQL将不允许您插入重复项.您的多个脚本可能会花费大量时间来尝试插入重复项,但它们不会成功.
编辑:从上述代码继续,并为您完成工作,如果插入成功,这就是您将要做的事情.
if(!$result) {
$query2 = "INSERT INTO `other_table` (NULL,`$company_name`)";
$result2 = mysql_query($query2);
} else if($result !== false) { // must use '!==' rather than '!=' because of loose PHP typing
$last_id = mysql_insert_id();
$query2 = "UPDATE `other_table` SET `some_column` = 'some_value' WHERE `id` = '$last_id'";
// OR, maybe you want this query
// $query2a = "INSERT INTO `other_table` (`id`,`foreign_key_id`) VALUES (NULL,'$last_id');
}
标签:dbi,mysql,perl 来源: https://codeday.me/bug/20191101/1986988.html