2011-12-03 15 views
6

Potrzebuję śledzić czas, w którym wiersz został wstawiony do bazy danych, oraz czas ostatniej modyfikacji.Znacznik czasu dla utworzenia wiersza i ostatniej modyfikacji

Starałem się stworzyć dwie oddzielne kolumny i używać CURRENT_TIMESTAMP:

create table def (
    id int, 
    creation timestamp 
    default CURRENT_TIMESTAMP, 
    modification timestamp 
    on update CURRENT_TIMESTAMP 
); 

to jednak produkowane błąd:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

Jaki jest najlepszy sposób to zrobić?

Mam na myśli procedurę przechowywaną, ale szukam standardowego rozwiązania. Zajmuję się również uprawnieniami dostępu - jako że niewiele programów/rzeczy powinno być w stanie dotknąć znaczników czasu, jak to tylko możliwe.


Mimo że wolałbym odpowiedzi MySQL, również są mile widziane rozwiązania dla innych RDBMS!

+0

Myślę, że znacznik czasu modyfikacji "brakująca cecha" został naprawiony po latach w jednej z bardziej aktualnych wersji MySQL. – hakre

Odpowiedz

3

To jest lame ograniczenie na MySQL. Jeśli przechodzisz przez aplikację, możesz dodać wywołanie time() dla kolumny created_at i pozwolić kolumnie updated_at użyć CURRENT_TIMESTAMP.

$sql = "INSERT INTO my_table SET name = 'Mike', created_at = " . time(); 

Wybrałbym to w kolumnie created_at, ponieważ prawdopodobnie nie zostanie dotknięte tak często, jak kolumna updated_at.

- Edit -

Jeszcze lepiej, korzystać z wbudowanego w MySQL now() funkcji. W ten sposób musisz martwić się strefą czasową serwera mysql, a nie strefami czasowymi serwera aplikacji ORAZ serwera mysql.

$sql = "INSERT INTO my_table SET name = 'Mike', created_at = NOW()"; 
+1

Dobrze wiedzieć, w której kolumnie używać "CURRENT_TIMESTAMP". –

+1

Możesz także użyć polecenia 'NOW()' w MySQL, jeśli się nie mylę. – Kevin

+1

@kevin: Masz rację, a tbh, NOW() jest preferowaną alternatywą, w ten sposób masz do czynienia tylko ze strefą czasową serwera mysql, zamiast z serwerem, na którym działa kod aplikacji ORAZ serwer mysql. –

2

Możesz użyć wyzwalacza. Aplikacja może również ustawić wartość, ale jeśli tak, zostanie nadpisana przez bazę danych.

delimiter // 
CREATE TRIGGER def_bef_update BEFORE UPDATE ON def FOR EACH ROW BEGIN 
    SET NEW.modification = CURRENT_TIMESTAMP; 
END// 
delimiter ; 

Można go również użyć do sprawdzenia danych i aktualizacji daty modyfikacji tylko w przypadku istotnych zmian.

Powiązane problemy