В настоящее время я пишу своего рода игру, и мне нужно упростить часть PHP до MySQL.
Прямо сейчас, чтобы обновить столбец, я делаю это (в PHP):
$res = $db->query("
SELECT succeeded
, failed
, prison
FROM users_crime_masteries
WHERE uid = $uid
AND cid = $crimeid
");
if ($status == 'succeeded') {
if (!$res->num_rows) {
$db->query("INSERT INTO users_crime_masteries (uid, cid, succeeded) VALUES($uid, $crimeid, 1)");
return 1;
}
else {
$row = $res->fetch_object();
$db->query("UPDATE users_crime_masteries SET succeeded = succeeded + 1 WHERE uid = $uid AND cid = $crimeid");
return $row->succeeded += 1;
}
}
^ Это половина функции, но идею вы поняли.
То, что я в основном пытаюсь достичь только в mySQL, - это то, что если нет строк, вставьте новую строку с cid и uid - если строка существует, обновление выполнено успешно с + 1.
Я просматривал stackoverflow и в основном понимаю, что мне нужно использовать запрос INSERT ... ON DUPLICATE KEY UPDATE.
Но я наткнулся на этот комментарий: MySql Table Insert, если не существует, иначе обновить
У меня есть столбец с именем id, который является автоматическим приращением и первичным ключом. Мой вопрос: вызовет ли это какие-либо проблемы?
Моя текущая версия MySQL: 5.7.24
Кроме того, для этого ON DUPLICATE KEY UPDATE я должен сделать столбцы uid и cid ключевыми?
Дополнительная информация:
Изменены запросы на:
switch($status) {
case 'succeeded' :
$db->query("INSERT INTO users_crime_masteries (uid, cid, succeeded) VALUES($userid, $crimeid, 1) ON DUPLICATE KEY UPDATE succeeded = succeeded + 1");
break;
case 'failed' :
$db->query("INSERT INTO users_crime_masteries (uid, cid, failed) VALUES($userid, $crimeid, 1) ON DUPLICATE KEY UPDATE failed = failed + 1");
break;
case 'prison' :
$db->query("INSERT INTO users_crime_masteries (uid, cid, failed, prison) VALUES($userid, $crimeid, 1, 1) ON DUPLICATE KEY update failed = failed + 1, prison = prison + 1");
break;
}
Выполните следующий запрос MySQL:
ALTER TABLE `users_crime_masteries`
ADD UNIQUE KEY `uid` (`uid`),
ADD UNIQUE KEY `cid` (`cid`),
Совершил несколько преступлений с другим cid, проверил через phpmyadmin, но есть только одна строка, обновляющая успешное поле.
Я что-то упустил?
Узнайте о подготовленных операторах для предотвращения внедрения sql
Я не понимаю смысла выбора
Если вы можете включить ADOdb, вы можете использовать метод заменять()






Если вы добавите в таблицу уникальный ключ (uid, cid), ON DUPLICATE KEY UPDATE должен работать. Ваша колонка id не пострадает и не вызовет проблем.
Кроме того, вы должны позаботиться о том, чтобы ваш код не был подвержен SQL-инъекциям, похоже, что это может быть.
почти работает! Можете ли вы проверить опубликованные мной правки?
Точно не знаю вашу модель, но думаю, что это будет ALTER TABLE users_crime_masteries ADD UNIQUE KEY crime_key (uid, cid);. Crime_key - это просто имя ключа, вы можете выбрать для него другое имя.
Нет проблем @ Love2Code. Просто обновите его, используя идентификатор или первичный ключ.