如何检查mySQL DB中的值是否存在?

时间:2011-12-24 07:39:31

标签: mysql perl dbi

我有一个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”查询,但它会在数据库上创建一个额外的命中。

我试图寻找答案,但是这里的每个问题或网络上的主题都谈到了使用主键检查。我不需要这个。数据库结构已经设置,但如果需要,我可以进行更改。该表将用作附加表。

还有其他方法吗?在DB和Perl中。

3 个答案:

答案 0 :(得分:4)

“脚本可以同时运行多次,因此我不能只将数据读入哈希并检查它是否已存在。”

听起来您最关心的是脚本的一个实例可能会在另一个脚本运行时插入新的公司名称。这两个脚本可能会检查数据库中是否存在该公司名称,然后它们可能都插入数据,从而导致重复。

  1. 假设我正确理解您的问题,您需要查看交易。您需要能够检查数据并在允许其他人检查该数据之前插入数据。这将使脚本的第二个实例检查数据,直到第一个实例完成检查并插入。

    退房: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开始您的一组查询。

  2. 或者,如果你在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将不允许您插入重复项。您的多个脚本可能会花费大量时间尝试插入重复项,但它们不会成功。

  3. 编辑:继续上面的代码,并为您完成工作,如果插入成功,您将采取以下措施。

    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');
    }
    

答案 1 :(得分:0)

我建议你编写一个存储过程(STP),它将输入作为公司名称。 在此STP中,首先检查现有公司名称。如果存在,则返回id。否则,插入并返回id。

这样,你只打了一次数据库

答案 2 :(得分:0)

对于InnoDB使用事务。对于MyISAM锁定表,请进行修改,解锁。