2010-09-27 14 views
61

Muszę zaktualizować 2 kolumny datetime i potrzebuję ich dokładnie tak samo, używając mysql w wersji 4.1.20. Używam tej kwerendy:mysql zaktualizować wiele kolumn z tym samym teraz()

mysql> update table set last_update=now(), last_monitor=now() where id=1; 

Jest bezpieczny czy jest szansa, że ​​kolumny są aktualizacja z innego czasu, z powodu 2 widocznych połączeń do now()?
Nie sądzę, że można go aktualizować różnymi wartościami (myślę, że wewnętrznie mysql wywołuje now() tylko raz w rzędzie lub coś podobnego), ale nie jestem ekspertem, jak myślisz?

drugie pytanie dlaczego ta kwerenda nie aktualizuje kolumn:

mysql> update table set last_update=last_monitor=now() where id=1; 
Query OK, 0 rows affected (0.00 sec) 
Rows matched: 1 Changed: 0 Warnings: 0 
+0

Proponuję, abyś usunął swoje drugie pytanie stąd i ostatecznie odesłał je w osobnym poście. –

Odpowiedz

103

znalazł rozwiązanie:

mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1; 

znalazłem this w MySQL Docs i po kilku testach to działa:

następujących zestawów rachunku col2 do bieżącego (Aktualizacja) wartości Col1, nie oryginalna wartość col1. W rezultacie col1 i col2 mają tę samą wartość. To zachowanie różni się od standardowego SQL.

AKTUALIZACJA t1 ZEST. Col1 = col1 + 1, col2 = col1;

Na drugie pytanie, nie ma żadnych odpowiedzi, nie znalazłem nic na mysql dokumenty na ten temat.

1

Jeśli naprawdę potrzebujesz, aby mieć pewność, że now() ma taką samą wartość można uruchomić dwie kwerendy (który będzie odpowiedzieć na drugie pytanie zbyt w takim razie jesteś z prośbą o update last_monitor = to last_update ale last_update nie zostały jeszcze zaktualizowane)

można zrobić coś takiego:

mysql> update table set last_update=now() where id=1; 
mysql> update table set last_monitor = last_update where id=1; 

W każdym razie myślę, że mysql jest na tyle sprytny, aby poprosić o numer now() tylko raz na zapytanie.

+0

Co powiesz na dwie aktualizacje?czy myślisz też, że mysql jest na tyle sprytny, aby połączyć je w jedno zdanie? ponieważ tak się nie stanie. – Dementic

1

Możesz zapisać wartość teraz() w zmiennej przed uruchomieniem kwerendy aktualizacji, a następnie użyć tej zmiennej, aby zaktualizować oba pola last_update i last_monitor.

Zapewni to, że teraz() zostanie wykonane tylko raz i ta sama wartość zostanie zaktualizowana dla obu kolumn, których potrzebujesz.

1

Możesz umieścić następujący kod na domyślnej wartości kolumny timestamp: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, więc po aktualizacji dwie kolumny mają tę samą wartość.

+1

AFAIK "on update" ma limit jednej kolumny na tabelę, więc nie można jej ustawić dla obu kolumn. –

4

Mysql nie jest bardzo sprytny. Jeśli chcesz użyć tego samego znacznika czasu w wielu aktualizacjach lub wstawić zapytania, musisz zadeklarować zmienną.

Po użyciu funkcji now() system wywoła bieżący znacznik czasu za każdym razem, gdy wywołasz go w innym zapytaniu.

Powiązane problemy