【问题标题】:How to check to see if a key exists before trying to insert it into a database?如何在尝试将密钥插入数据库之前检查它是否存在?
【发布时间】:2011-09-15 05:40:08
【问题描述】:

我正在从日历提要中提取数据,并且日历中的每个事件都有一个唯一的 $EventID 字符串。我正在使用 PHP。

我有一个带有 Event_ID 列的 SQL 数据库。这些 ID 是字符串。我需要能够将我的$EventIDEvent_ID 列进行比较,如果它不存在,则将其放入数据库中。 我在数据库中设置了一个自动递增的主键,我在想我可以设置一个循环来递增它们并将每个与 $EventID 进行比较,但我想知道是否有更好的方法 - 也许是PHP函数我不知道?

我有很多代码,但基本上我有:

<?php
$EventID = $event->id;  //This is the event ID

mysql_query("INSERT INTO myTable
              (Event_ID, Date_added, Date_edited)
             VALUES 
              ('$EventID', '$dateAdded', '$lastEdited')");

?>

那么我该如何设置一个条件来检查数据库中已经存在的所有Event_IDs 与$EventID

【问题讨论】:

  • 你说的是单个表还是整个数据库?

标签: php mysql sql insert


【解决方案1】:
$query = "SELECT * FROM  `myTable`  WHERE `Event_ID`='$EventID' ";
    $result = mysql_query($query);
if (!mysql_num_rows($result))
 // INSERT QUERY

检查Event ID是否存在,如果不存在则插入

【讨论】:

  • 你让它变得复杂了。 “插入忽略”只需一个查询即可产生相同的效果。
  • 如果 EventId 是主键或设置为唯一键,则插入忽略将起作用,否则将再次插入。
  • 插入忽略似乎对我不起作用-但我责怪我的无能:)
  • 听着,也许我遗漏了一些东西......但是如果相同的代码由两个不同的“线程”执行会发生什么?还是“页面”,这是 PHP?这不是并发访问会导致重复的经典案例吗?在进行 Select 之前,您是否获得了锁?
  • 是的,好的。但我仍然认为,无论谁写了接受的答案,至少应该对此提出警告。其他人可能会在不同的背景下寻找相同的答案,可能在一个月或一年内。 SO也是关于this...
【解决方案2】:

您可以跳过“选择”查询并执行“插入忽略”:

mysql_query("INSERT IGNORE INTO myTable
              (Event_ID, Date_added, Date_edited)
             VALUES 
              ('$EventID', '$dateAdded', '$lastEdited')");

这将保留现有的 Event_id,如果需要,只需添加新记录。

【讨论】:

  • 其实——这也可以回答我的下一个问题……如果我的$lastEdited变量比以前发生了变化,那么我需要重写行中的数据。这也能实现吗?
  • INSERT IGNORE INTO myTable (Event_ID, Date_added, Date_edited) VALUES ('$EventID', '$dateAdded', '$lastEdited') ON DUPLICATE KEY UPDATE Date_added = '$dateAdded', Date_edited = '$lastEdited'
  • 没有。如果您尝试插入具有重复主键或唯一键的行,则插入忽略将中止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多