2013-01-26 10 views
8

chcę wykonać to zapytanie MySQL:MySQL - wstawić jeżeli nie istnieje jeszcze

INSERT INTO `cron-stats` (`user`) VALUES (".(int)$d['by-user'].")

Gdy taki użytkownik jeszcze nie istnieje, tak jak w:

SELECT 1 
FROM `cron-stats` 
WHERE `user` = ".(int)$d['by-user']." 

jak można Wykonuję to w jednym zapytaniu?

+0

uczynić pole 'unique' –

+0

I dodać IGNORUJ po INSERT – Strawberry

+0

byłaś już bada [' INSERT' stronę odniesienia składnia] (http://dev.mysql.com/doc/refman/5.6/en/ insert.html)? – Gumbo

Odpowiedz

17

można użyć ON DUPLICATE KEY UPDATE

INSERT INTO `cron-stats` (`user`) VALUES ('yourValue') 
ON DUPLICATE KEY UPDATE user = user; 

ale w celu wykonania oświadczenie INSERT dobrze, trzeba ustawić indeks UNIQUE na kolumnie user.

jeśli kolumna ma index jeszcze wykonać poniższe oświadczenie,

ALTER TABLE `cron-stats` ADD CONSTRAINT tb_un UNIQUE (`user`) 
+0

Nie jestem pewien, czy to pomaga. Używam tego w CRON, gdzie uruchamiam '' UPDATE'' dla istniejących wpisów. Zanim uruchomi się '' UPDATE'', chcę przygotować nieistniejące wpisy poprzez INSERTing wartości null. Czy to właściwe rozwiązanie? –

+0

jaki jest powód, dla którego należy najpierw wstawić wartości puste? –

+0

No cóż, to nie działa. Oto pełne zapytanie z błędem: http://pastebin.com/PyHMY9RG –

5

Trochę hacky, ale jeśli użyć tabeli SELECT pochodzący zamiast VALUES można zrobić:

INSERT INTO `cron-stats`(`user`) 
SELECT u 
FROM (SELECT @dByUser AS u) x 
WHERE NOT EXISTS(SELECT 1 FROM `cron-stats` WHERE `user` = @dByUser) 

SQL Fiddle demo

-2

Możesz wypróbować to, używając innego warunku:

$chk = mysql_query("select 'the username' FROM `cron-stats`"); 
$rs = mysql_fetch_array($chk); 
if($rs == "") 
{ 
    $ins = mysql_query("INSERT INTO `cron-stats` (`user`) VALUES ('.(int)$d['by-user'].')"); 
} 
else{ 
    echo "Duplicate entry"; 
} 
+1

To jest straszne rozwiązanie, ponieważ bardzo przegrywasz z korzyściami wydajności i ACID. Naprawdę musiałbyś zawrzeć to w transakcji, aby działało poprawnie, i dlaczego miałbyś tak czynić, skoro istnieją jasne polecenia, które są o wiele lepsze? – Brett

Powiązane problemy