2013-02-10 14 views
12

Mam następującą strukturę tabeli:Najszybszy sposób na aktualizację tabeli MySQL, jeśli istnieje inny wiersz insert. Ponad 2 nieunikalne klucze

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`) 
) 

Obecnie sprawdzasz & insert/update z następującym fragmencie:

$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'"); 
} 

jest to najszybszy sposób, aby aktualizować MySQL tabela czy istnieje wiersz else insert with więcej niż 2 klucze nieunikalne?

Odpowiedz

17

wystarczy użyć 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; 

ale zanim cokolwiek innego, należy zdefiniować UNIQUE ograniczenia na kolumnach.

ALTER TABLE reports_adv ADD CONSTRAINT tb_uq UNIQUE (day, uid, siteid, cid) 
+0

Bardzo dziękuję. Działa świetnie. – dracosu

+0

Nie ma za co. '' D' –

+0

Jeszcze jedno pytanie. Kiedy wyświetlam dane, których używam na WHERE day, uid, siteid i cid. Jakie indeksy powinienem dodać? – dracosu