Самый быстрый способ обновить таблицу MySQL, если строка существует, иначе вставьте. Более 2 неуникальных ключей

У меня есть следующая структура таблицы:

 CREATE TABLE IF NOT EXISTS `reports` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `day` int(11) NOT NULL,
  `uid` int(11) NOT NULL,
  `siteid` int(11) NOT NULL,
  `cid` int(3) NOT NULL,
  `visits` int(11) NOT NULL,
  PRIMARY KEY (`id`)
 )

В настоящее время я проверяю и вставляю/обновляю следующий фрагмент:

 $checkq = mysql_query("SELECT count(*) as rowexist FROM reports WHERE day='$day' AND uid='$uid' AND siteid='$sid' AND cid='$cid'") or die(mysql_error()); 
$checkr = mysql_fetch_array($checkq);

if ($checkr['rowexist'] > 0) {
 mysql_query("UPDATE reports_adv SET visits=visits+1 WHERE  day='$day' AND uid='$uid' AND siteid='$sid' AND cid='$cid'"); 
} else {
 mysql_query("INSERT INTO reports_adv SET day='$day', uid='$uid', siteid='$sid', cid='$cid', visits='1'");
}

Является ли самый быстрый способ обновить эту таблицу MySQL, если строка существует, иначе вставьте более двух неуникальных ключей?


person dracosu    schedule 10.02.2013    source источник


Ответы (1)


просто используйте INSERT...ON DUPLICATE KEY UPDATE

INSERT INTO reports_adv (day, uid, siteid, cid, visits) 
VALUES ('$day', '$uid', '$sid', '$cid', 1)
ON DUPLICATE KEY UPDATE visits=visits+1;

но прежде всего вы должны определить ограничение UNIQUE для столбцов.

ALTER TABLE reports_adv  ADD CONSTRAINT tb_uq UNIQUE (day, uid, siteid, cid)
person John Woo    schedule 10.02.2013
comment
Большое спасибо. Работает отлично. - person dracosu; 10.02.2013
comment
Еще один вопрос. Когда я показываю данные, которые я использую в WHERE day, uid, siteid и cid. Какие индексы добавить? - person dracosu; 10.02.2013
comment
Нет, так как этот оператор UNIQUE (day, uid, siteid, cid) неявно добавляет для вас индекс. - person John Woo; 10.02.2013
comment
Большой. Еще раз спасибо. Вы спасли меня :) - person dracosu; 10.02.2013