如果两个键不存在,则插入表中

时间:2013-03-28 16:36:28

标签: mysql pdo

我有一个映射itemId(item.id)和tagId(tag.id)的表。

我正在编写一个需要插入新行的查询,但仅当BOTH itemId和tagId还没有条目时才会这样做。最好的方法是什么?

这是我当前的查询尚未检查现有匹配项:

// create tag-item maps
$sql = 'INSERT INTO item_tag
      SELECT :itemId AS iid, tag.id AS tid
      FROM tag
      WHERE tag.name=:name';
try{
  $stmt = $db->dbh->prepare($sql);
  for($i = 0; $i < $count; $i++) {
    $data = array(':itemId' => $itemId, ':name' => $tags[$i]);
    $result = $stmt->execute($data);
    if($result !== false) {
      // Do nothing
    }else {
      return false;
    }
  }
  return true;
}catch(PDOException $e) {
 logit($e->getMessage());
 return false;
}

1 个答案:

答案 0 :(得分:1)

UNIQUE约束是理想的解决方案,根据docs,MyISAM引擎支持它们。

ALTER TABLE item_tag ADD CONSTRAINT item_tag_iid_tid_uq UNIQUE (iid, tid);

然后,如果您的INSERT尝试添加重复的iidtid)对,则会抛出,您可以在catch代码中处理它。

如果您不想执行UNIQUE约束,则可以在INSERT查询中添加“存在”检查:

INSERT INTO item_tag
  SELECT :itemId AS iid, tag.id AS tid
  FROM tag
  WHERE tag.name=:name' AND NOT EXISTS (
    SELECT * FROM item_tag WHERE iid=:itemId AND tid=tag.id)

我使用我自己的不同命名的表测试了这个,所以希望我能正确地将它“翻译”到你的表/列名。