如何检查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');
}
上一篇:使用Perl重新格式化PHP代码


下一篇:从相对路径确定绝对路径