2012-03-13 13 views
25

Aktualnie używam dwóch zapytań o aktualizację i zastanawiam się, czy istnieje sposób na ograniczenie go do jednego.Pole aktualizacji MySQL zestawu IF NULL lub innej wartości

field1 OFTYPE INT 
field2 OFTYPE DATETIME 
field3 OFTYPE DATETIME 

UPDATE `Table1` SET `field1` = `field1` + 1, `field2` = NOW() WHERE `id` = $id; 
UPDATE `Table1` SET `field3` = NOW() WHERE `id` = $id AND (`field3` < '2011-00-00 00:00:00' OR `field3` IS NULL); 

Próbuję uzyskać kwerendę, która będzie zrobić UPDATE więcej tak:

UPDATE `Table1` 
SET `field1` = `field1` + 1, 
    `field2` = NOW(), 
    `field3` = ISNULL(NOW(), `first_seen`); 
+0

Wstawianie lub usuwanie instrukcji aktualizacji może aktualizować tylko jedną tabelę/widok. Niezła próba! – Har

+0

@HarHaHu OP aktualizuje tylko jedną tabelę, więc jest idealnie. –

+0

@HarHaHu to tylko jeden stół, ponieważ go czytam;) –

Odpowiedz

59

myślę, że jest to możliwe, aby to zrobić za pomocą instrukcji IF. Oświadczenie IF trwa 3 parametry podczas korzystania go: Wyrażenie wartość, jeśli to prawda, jeśli wartość fałszywą

Tak więc w Twoim przypadku można chyba napisać zapytania w jednym iść tak:

UPDATE Table1 
SET 
    field1 = field1 + 1, 
    field2 = NOW(), 
    field3 = IF(field3 < '2011-00-00 00:00:00' OR field3 IS NULL, NOW(), field3) 
WHERE id = $id; 

W ten sposób, jeśli wyrażenie jest prawdziwe, to field3 będzie NOW() iw przeciwnym razie pozostanie bez zmian.

+0

Data powoduje błąd mysql, zmień na "2011-01-01 00:00:00" – Madarco

0

Jeśli field3 muszą być aktualizowane z innego stanu z field1 i field2, przypuszczam, że ciebie nie można zrobić wszystkiego w jednym zapytaniu. Co można zrobić, to: TRANSACTION, jeśli zapytania muszą być wykonywane razem lub nic.

10

W twoim przypadku można użyć CASE *:

UPDATE Table1 
SET field1 = field1 + 1, 
    field2 = NOW(), 
    field3 = 
     CASE 
     WHEN field3 < '2011-00-00 00:00:00' THEN /* Evaluates to false if NULL */ 
      NOW() 
     WHEN field3 IS NULL THEN 
      NOW() 
     ELSE /* Don't change */ 
      field3 
     END 
WHERE id = 1 

* Pun opcjonalnie

Powiązane problemy