PDO: проверить наличие тегов в БД и затем вставить - PullRequest
0 голосов
/ 28 января 2010

Я работаю с PDO соединением для mysql, и я хотел бы получить некоторое мнение о запросе, который я использую, чтобы проверить, присутствует ли tags в базе данных, и добавить его в случае его нет.

// the tags are allready processed in $tags array 

$check_stmt = $connection->prepare ("SELECT * FROM tags WHERE tag_name = :tag_name");
$save_stmt = $connection->prepare ("INSERT INTO tags (tag_name) VALUES (:tag_name)");

foreach ($tags as $current_tag) {
    $check_stmt->bindParam (':tag_name', $current_tag, PDO::PARAM_STR, 32);
    $save_stmt->bindParam (':tag_name', $current_tag, PDO::PARAM_STR, 32);
    $check_stmt->execute ($current_tag);
    if ($check_stmt->rowCount() == 0) $save_stmt->execute ($current_tag);
}

Я не разбираюсь в базах данных, поэтому не уверен, что запрос хорошо спроектирован

Ответы [ 2 ]

1 голос
/ 28 января 2010

Я бы немного скорректировал ваш запрос выбора, чтобы оптимизировать:

SELECT 1 AS found FROM tags WHERE tag_name = :tag_name LIMIT 1

SELECTing * передает намного больше данных (все поля в соответствующих записях) из БД в ваше приложение, чем это необходимо. выбор только тех полей, которые вам нужны, гораздо эффективнее, и в этом случае похоже, что вы просто проверяете существование, поэтому вам не нужны любые данные записи, поэтому SELECT 1.

LIMIT 1 ограничивает результаты запроса одной записью вместо всех совпадающих. Более быстрое выполнение запроса и повторная передача данных.

0 голосов
/ 28 января 2010

Некоторые более специфичные для MySQL опции включают простое использование REPLACE INTO (не) или ключевое слово IGNORE в сочетании с INSERT (рекомендуется). Синтаксис INSERT IGNORE будет немного быстрее, чем выполнение SELECT отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...