Привет, ребята, быстрый вопрос, у меня в настоящее время есть инструкция insert $query= "INSERT into new_mail VALUES ('$to1', '0')";
где поля – имя пользователя, и message_number. В настоящее время, что я сделал бы, чтобы проверить, существует ли запись, выполняет запрос выбора, а затем проверяет количество строк с помощью mysql_num_rows
(php). Если строки == 1, то я получаю текущий номер_сообщения и устанавливаю его равным
$row['message_number']+1.
Затем я обновляю эту запись другим запросом.
Есть ли более простой способ сделать все это только в mysql только с одним запросом (проверить, существует ли, если не вставить, если так обновить message_number, увеличить на 1)?
Используйте INSERT...ON DUPLICATE KEY UPDATE
. В руководстве по MySQL есть пример, который делает практически то, что вам нужно:
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
Для выполнения этой работы вам нужно добавить индекс UNIQUE в столбец, который вы используете для проверки дубликатов. Однако есть одно важное предупреждение:
В общем, вы должны стараться избегать использования предложения ON DUPLICATE KEY в таблицах с несколькими уникальными индексами.
В зависимости от структуры вашей таблицы вы можете использовать функцию ON DUPLICATE KEY UPDATE
(ссылка на руководство MySQL) INSERT
:
INSERT into new_mail VALUES ('$to1', '0') ON DUPLICATE KEY UPDATE message_number=message_number+1
Немного смущенный вашим вопросом и вашими структурами таблиц, но я думаю, что вам нужно что-то подобное.
INSERT INTO new_mail (username, message_number) VALUES ($username, $message_number) ON DUPLICATE KEY UPDATE message_number=message_number + 1;
Предполагается, что username
является вашим основным ключом (скорее всего, это похоже на userid). Надеюсь это поможет.
EDIT: ответы ON DUPLICATE KEY UPDATE лучше, но вы можете сделать это (ускользает запрос выбора):
Предполагая, что вы используете экстензон mysqli:
$db = //Some construction of mysqli object; $sql = 'UPDATE tablename SET RowValue = RowValue + 1 WHERE message_number = ?'; $updateStatement = $db->prepare($sql); $updateStatement->bind_param('i', $message_number); $message_number = //Set message number; $updateStatement->execute(); if ($updateStatement->affectedRows == 0) { $sql = 'INSERT INTO tablename (RowValue, message_number) VALUES (?, ?)'; $insertStatement = $db->prepare($sql); $insertStatement->bind_param('ii', $rowValue, $messageNumber); $rowValue = something; $messageNumber = something; $insertStatement->execute(); }