mysql - 如何检查mySQL数据库中的值是否存在?

标签 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 中。

最佳答案

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

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

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

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

编辑:从上面的代码继续,并为您完成您的工作,如果插入成功,您将执行以下操作。

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

关于mysql - 如何检查mySQL数据库中的值是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8623375/

相关文章:

mysql - AWS : Unable to connect Amazon QuickSight to RDS

mysql - 如何在 Apache::DBI 中禁用 ping?

mysql - 使用csv中的key通过dbi检索对应的多个key及其值

sql - 为什么 $dbh->do ('VACUUM' ) 在 Perl 的 DBD::SQLite 中失败?

mysql - Rails 3.2.6 和通过迁移创建数据库 View

我为测试制作的简单表格的 PHP/MySQL 错误(我正在尝试自学一些 MySQL/PHP)

python - 我如何在表达式中使用 Perl 的 s///?

perl - 在 Perl 中将混合的 ISO-8859-1 和 UTF-8 多行字符串强制转换为 UTF-8

perl - 在 Perl 中解码 UTF-8 URL

python - 使用migrate命令创建数据库表时出错