Soru MySQL ON UPDATE CURRENT_TIMESTAMP güncellenmiyor


Şuna benzeyen bir masa var:

CREATE TABLE IF NOT EXISTS `Hosts` (
`id` int(128) NOT NULL AUTO_INCREMENT,
`IP` varchar(15) NOT NULL DEFAULT '',
`Port` varchar(5) NOT NULL DEFAULT '',
`Password` varchar(32) NOT NULL DEFAULT '',
`Username` varchar(32) NOT NULL DEFAULT '',
`Tid` varchar(32) NOT NULL DEFAULT '',
`EquipType` varchar(64) NOT NULL DEFAULT '',
`Version` varchar(128) DEFAULT NULL,
`Status` varchar(10) NOT NULL DEFAULT '',
`Location` varchar(128) NOT NULL DEFAULT '',
`Lastconnection` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
`Lastbackup` date NOT NULL DEFAULT '0000-00-00',
`Backupstatus` varchar(64) NOT NULL DEFAULT '',
`Backupmsg` text,
`Backupfile` varchar(30) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `IP` (`IP`),
KEY `Tid` (`Tid`),
KEY `EquipType` (`EquipType`),
KEY `Status` (`Status`),
KEY `Lastbackup` (`Lastbackup`),
KEY `Backupstatus` (`Backupstatus`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=716 ;

Aklımda, bu bir satırın güncellendiği her zaman, 'Lastconnection' alanının geçerli zaman damgasıyla damgalanması gerektiği anlamına gelir. Ancak, şöyle bir şey yürüttüğümde:

update Hosts set Backupstatus = 'FAIL',  Backupmsg = 'Connection timed out' where Tid = 'SITE001'

Son bağlantı '0000-00-00 00:00:00'. Göremediğim bir veritabanı sorunu var ya da 'ON UPDATE CURRENT_TIMESTAMP' maddesini tamamen yanlış anlamıyorum.


25
2018-04-06 18:36


Menşei


Versiyonun nedir Sadece bu hata raporu nedeniyle soruyorum: bugs.mysql.com/bug.php?id=28904 - Horus
5.1.40'ım var gibi görünüyor. - coding_hero
Raporunuzdaki ts sütununun '0000-00-00 00:00:00' ile dolduğunu tahmin etmeme engel olacak. NO_ZERO_DATE modu ile ilgili yapmak, ancak bir göz atın dev.mysql.com/doc/refman/5.0/en/... - initall
Bence bu olabilir. Birçok satır düzgün şekilde damgalanır, ancak bazılarının yinelenen değerleri olabilir. Yükseltmeyi deneyeceğim. - coding_hero
göre dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html Geçerli zaman damgası, SADECE satırdaki değerlerden biri değiştiğinde güncellenir (yani, tüm değerler aynı kalırsa, lastconnection Çalıştırsanız bile sütun güncellenmez UPDATE sorgu) - andrei


Cevaplar:


Güncelleme yaparken bu alan için null kullanmayı denediniz mi?

Varsayılan değeri de ayarlamayı deneyebilirsiniz. CURRENT_TIMESTAMP, ziyade 0000-00-00 00:00:00.

Yine de, ne zaman oluşturma ve güncelleme zamanına sahip olmak istediğimde, her zaman aşağıdakileri kullanırım:

...
CREATED timestamp NOT NULL default '0000-00-00 00:00:00',
UPDATED timestamp NOT NULL default now() on update now(),
....

kullanırım now()çünkü bir takma addır CURRENT_TIMESTAMP ve daha kısa. Sonunda, masa yapısı alır CURRENT_TIMESTAMP, o yüzden endişelenme.

İle hile CREATED alan, her iki alanda da null kullanmayı hatırlamaktır INSERT ifadeleri UPDATE ifadeler gerekli değildir:

INSERT INTO mytable (field1, field2, created, updated)
VALUES ('foo', 'bar', null, null);

33
2017-08-03 08:34



Bu konuda daha fazla açıklama ... dev.mysql.com/doc/refman/5.0/en/timestamp.html - barranquero
Zaman damgası alanını null güncelleme ifadesinde. Artık alan her güncellendiğinde (veriler gerçekten değişmediğinde bile). - testing
dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html - Gerard Roche
şimdi () CURRENT_TIMESTAMP için bir takma ad mı? gerçekten? - zloctb
Kullanmak daha iyi değil mi UTC_TIMESTAMP() MySQL sunucu zaman dilimi ile ilgili problemlerden kaçınmak için uygulamanıza farklı mı? - rjh


Güncelleme bildiriminin hiçbir şeyi değiştirmemesi durumu olabilir. Satır varsa Tid = 'SITE001' zaten Backupstatus ayarlanır 'FAIL' ve Backupmsg ayarlanır 'Connection timed out' (belki, bir önceki yedekleme girişimi ile ayarlandı), sonra MySQL bu satırı atlayacak ve bu yüzden değişmeyecek. Lastconnection zaman damgası.

Ben de görüyorum ON UPDATE CURRENT_TIMESTAMP veri değişikliklerini takip etmek için daha çok yönetimsel bir özellik gibi. Bir programcı olarak, zaman damgası güncellemesini açıkça eklerim:

update Hosts
set Backupstatus = 'FAIL', Backupmsg = 'Connection timed out', Lastconnection = NOW() where Tid = 'SITE001'
.


12
2018-06-19 18:24



Yaygın bir hata, "güncelleme" cümlesi daha yönetimseldir ve bu şekilde kullanılmamalıdır. Verilerde gerçek bir değişiklik yoksa, işe yaramaz. - Thomas Decaux


Değersiz olsaydı hatırlamalısın değişmiş güncellemede geçerli zaman damgasını ayarlamaz,

Sorgudaki değeri ayarlamanız gerekir NOW() Geçerli zaman damgası için ayarlamak için!

update Hosts set Backupstatus = 'FAIL',Lastconnection = NOW() , Backupmsg = 'Connection timed out' where Tid = 'SITE001'

Geçerli zaman damgasının değişmesi için değerin değişmesi gerektiğini unutmayın.


7
2017-11-24 07:26





Otomatik özellikleri belirtmek için DEFAULT CURRENT_TIMESTAMP ve ON UPDATE CURRENT_TIMESTAMP maddeleri. Maddelerin sırası önemli değil. Her ikisi de bir sütun tanımında mevcutsa, önce ya ortaya çıkabilir. Herhangi bir eşanlamlı CURRENT_TIMESTAMP ile aynı anlama gelmek CURRENT_TIMESTAMP. Bunlar CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, ve LOCALTIMESTAMP().

Kullanımı DEFAULT CURRENT_TIMESTAMP ve ON UPDATE CURRENT_TIMESTAMP özgüdür TIMESTAMP. DEFAULT fıkra, aynı zamanda, sabit (otomatik olmayan) bir varsayılan değer belirtmek için kullanılabilir; Örneğin, DEFAULT 0 veya DEFAULT '2000-01-01 00:00:00'.

DEFAULT 0 eğer işe yaramazsa NO_ZERO_DATE SQL modu, bu modun reddedilmesi için "sıfır" tarih değerlerine (örneğin 0 '0000-00-00 00:00:00' olarak belirtilir) neden olduğu için etkindir. Farkında olun TRADITIONAL SQL modu içerir NO_ZERO_DATE.

Ayrıca, herhangi birini başlatabilir veya güncelleyebilirsiniz. TIMESTAMP atama yaparak geçerli tarih ve saate göre sütun NULL ile tanımlanmadığı sürece değer NULL izin özniteliği NULL değerler.


1
2018-06-07 04:31



Bir şeyi kaçırıyor muyum, yoksa bu cevap OP'nin zaten ne olduğunu yapmak için iş, yine de başarısız oldu? Zaman damgası alanı ile dedi ON UPDATE CURRENT_TIMESTAMP  güncelleme değişmez, o değil mi? Zaman damgaları hakkında genel bilgiler; Bu soruya verilen yanlış cevap. - Frungi
Teşekkürler, bu sadece aradığım açıklama! - Really Nice Code


Kaydın her değiştiğinde kayıt zaman damgasını otomatik olarak güncellemesini istiyorsanız, burada yapmanız gereken dört basit adım vardır (yönetmek için komut satırını veya GUI kullanıyor olmanıza bağlı olarak, tek adımda olabilir):

  1. Otomatik güncellenen zaman damgasını tutmak için alan oluşturun (genellikle 'modifiye edilmiş' olarak adlandırıyorum).
  2. Alan belirtin 'TIMESTAMP' olarak yazın
  3. Varsayılan alanı 'CURRENT_TIMESTAMP' olarak belirt
  4. "ON UPDATE CURRENT_TIMESTAMP" olarak ek alan belirtin

Şimdi zaman damgasını içeren alan, her zaman kayıt güncellendiğinde geçerli zaman damgasına güncellenir.


-1
2017-10-01 18:52



Bu sadece diğer cevaplarda verilen bilgileri yeniden gönderir. - Mark Taylor
Muhtasar, okunması kolay .... bana yardım etti! Güncellenmediğinde yalnızca güncelleme yapıldı. 4. adımı kaçırdım. - Mikeys4u