次のような表があります。
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」句を完全に誤解しています。
更新時にそのフィールドに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);
_
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'
値がchangedでなかった場合、更新時に現在のタイムスタンプが設定されないことを覚えておく必要があります。
現在のタイムスタンプに設定するには、クエリNOW()
の値を設定する必要があります!!!
update Hosts set Backupstatus = 'FAIL',Lastconnection = NOW() , Backupmsg = 'Connection timed out' where Tid = 'SITE001'
現在のタイムスタンプを変更するには、値を変更する必要があることに注意してください。
自動プロパティを指定するには、_DEFAULT CURRENT_TIMESTAMP
_および_ON UPDATE CURRENT_TIMESTAMP
_句を使用します。句の順序は関係ありません。列定義に両方が存在する場合、どちらかが最初に発生する可能性があります。 _CURRENT_TIMESTAMP
_の同義語は、_CURRENT_TIMESTAMP
_と同じ意味を持ちます。これらは、CURRENT_TIMESTAMP()
、NOW()
、LOCALTIME
、LOCALTIME()
、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
値。