web-dev-qa-db-ja.com

MySQL ON UPDATE CURRENT_TIMESTAMPが更新されていません

次のような表があります。

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 ;

私の考えでは、これは、行が更新されるたびに、フィールド「Lastconnection」に現在のタイムスタンプがスタンプされることを意味します。ただし、次のようなものを実行すると:

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

最終接続は「0000-00-00 00:00:00」のままです。表示されていないデータベースの問題があるか、「ON UPDATE CURRENT_TIMESTAMP」句を完全に誤解しています。

29
coding_hero

更新時にそのフィールドにnullを使用しようとしましたか?

デフォルト値を_CURRENT_TIMESTAMP_ではなく_0000-00-00 00:00:00_に設定してみることもできます。

それにもかかわらず、作成と更新の時間を持ちたいときはいつでも次のものを使用します:

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

_CURRENT_TIMESTAMP_のエイリアスであり、より短いため、now()を使用します。最後に、テーブル構造は_CURRENT_TIMESTAMP_を取得するため、心配する必要はありません。

CREATEDフィールドのコツは、INSERTステートメントの両方のフィールドでnullを使用することを忘れないことです。UPDATEステートメントの場合は必須ではありません。

_INSERT INTO mytable (field1, field2, created, updated)
VALUES ('foo', 'bar', null, null);
_
33
barranquero

Updateステートメントが何も変更しない場合があります。 Tid = 'SITE001'を含む行に既にBackupstatus'FAIL'に設定され、Backupmsg'Connection timed out'に設定されている場合(以前のバックアップ試行によって設定された可能性があります) MySQLはこの行をスキップするため、Lastconnectionタイムスタンプは変更されません。

また、ON UPDATE CURRENT_TIMESTAMPは、データの変更を追跡する管理機能に似ています。プログラマとして、タイムスタンプの更新を明示的に追加します。

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

15
Gas Welder

値がchangedでなかった場合、更新時に現在のタイムスタンプが設定されないことを覚えておく必要があります。

現在のタイムスタンプに設定するには、クエリNOW()の値を設定する必要があります!!!

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

現在のタイムスタンプを変更するには、値を変更する必要があることに注意してください。

7
Pini Cheyni

自動プロパティを指定するには、_DEFAULT CURRENT_TIMESTAMP_および_ON UPDATE CURRENT_TIMESTAMP_句を使用します。句の順序は関係ありません。列定義に両方が存在する場合、どちらかが最初に発生する可能性があります。 _CURRENT_TIMESTAMP_の同義語は、_CURRENT_TIMESTAMP_と同じ意味を持ちます。これらは、CURRENT_TIMESTAMP()NOW()LOCALTIMELOCALTIME()LOCALTIMESTAMP、およびLOCALTIMESTAMP()です。

_DEFAULT CURRENT_TIMESTAMP_および_ON UPDATE CURRENT_TIMESTAMP_の使用は、TIMESTAMPに固有です。 DEFAULT句を使用して、定数(非自動)デフォルト値を指定することもできます。たとえば、_DEFAULT 0_または_DEFAULT '2000-01-01 00:00:00'_です。

_DEFAULT 0_は、_NO_ZERO_DATE_ SQLモードが有効になっている場合は機能しません。そのモードでは、「ゼロ」の日付値(たとえば、0 '0000-00-00 00:00:00'として)が発生するためです。拒否されます。 TRADITIONAL SQLモードには_NO_ZERO_DATE_が含まれることに注意してください。

さらに、許可するTIMESTAMP属性で定義されていない限り、NULL値を割り当てることにより、NULL列を現在の日時に初期化または更新できます。 NULL値。

1
Nag Hammadi