Mysql create/update timestamp, čas vložení a čas poslední úpravy položky

Jak řešíte čas vzniku a čas poslední úpravy řádku v tabulce? Řešení s jedním triggerem.


Ukázky k nahlédnutí createdUpdatedTime.txt.

K popsanému příkladu si můžete prohlédnout i test ke stažení.

Takhle to řeším já.

  1. DROP TABLE IF EXISTS test;
  2. CREATE TABLE IF NOT EXISTS `test` (
  3. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  4. `name` varchar(100) COLLATE utf8_czech_ci NOT NULL,
  5. `ditime` timestamp NULL DEFAULT NULL,
  6. `dutime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
  9. DROP TRIGGER IF EXISTS test_insert;
  10. DELIMITER //
  11. CREATE TRIGGER test_insert BEFORE INSERT ON test
  12. FOR EACH ROW BEGIN
  13. IF NEW.ditime IS NULL THEN
  14. SET NEW.ditime = NOW();
  15. END IF;
  16. END//
  17. DELIMITER ;

Problém je v tom, že chcete, aby časy se správně ukládali za těchto podmínek:

  1. update s definovaným date insert nebo date update, nebo obojí,
  2. insert s definovaným date insert nebo date update, nebo obojí,
  3. i v případě vynechání date insert nebo date update v sql dotazu.

 

 

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
01.09.2010 14:50 | Anonym (paranoiq) | "Položka (Název) nesmí být prázdná."

s timestamp on update current_timestamp je ten problém, že ho lze obejít implicitním vložením údaje, který automaticky generovaný čas přebije. trigger obejít nejde. u tvého řešení je zase ten problém, že se čas updatu zapíše i když nedošlo při zápisu k modifikaci dat (když vložím stejná data jaká už v řádku jsou, trigger se i přesto provede).

já detekuji, jestli skutečně došlo ke změně dat v řádku a až poté zapisuji info o změně. to je ale dost složité na ruční psaní triggerů a tak jsem si na to napsal automat, který mi hotový trigger vygeneruje: http://gist.github.com/477277

01.09.2010 14:52 | Anonym (paranoiq) | Re: samozřejmě, že "explicitním" !
04.09.2010 11:12 | Administrátor | Re:

seš si jistý tím že datum se přepíše? zkoušel si? nevím jestli verze mysql se chovají jinak, ale mám za to že se mi nezmění v případě že se nezmění data

jinak s triggerem mám právě ten problém co povídáš, představ si že děláš dump, měníš název databáze nebo něco podobného, replikuješ data atd. tak právě potřebuješ tomu sloupečku vnutit ten čas, chci zachovat původní čas ne všude aktuální

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>