mysql 表设计时的update_time自动更新
11.3.5?Automatic Initialization and Updating for TIMESTAMP and DATETIME
原文地址:https://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html
As of MySQL 5.6.5,?TIMESTAMP?and?DATETIME?columns can be automatically initializated and updated to the current date and time (that is, the current timestamp). Before 5.6.5, this is true only for?TIMESTAMP, and for at most one?TIMESTAMP?column per table. The following notes first describe automatic initialization and updating for MySQL 5.6.5 and up, then the differences for versions preceding 5.6.5.
For any?TIMESTAMP?or?DATETIME?column in a table, you can assign the current timestamp as the default value, the auto-update value, or both:
-
An auto-initialized column is set to the current timestamp for inserted rows that specify no value for the column.
-
An auto-updated column is automatically updated to the current timestamp when the value of any other column in the row is changed from its current value. An auto-updated column remains unchanged if all other columns are set to their current values. To prevent an auto-updated column from updating when other columns change, explicitly set it to its current value. To update an auto-updated column even when other columns do not change, explicitly set it to the value it should have (for example, set it to?CURRENT_TIMESTAMP).
In addition, you can initialize or update any?TIMESTAMP?column to the current date and time by assigning it a?NULLvalue, unless it has been defined with the?NULL?attribute to permit?NULL?values.
To specify automatic properties, use the?DEFAULT CURRENT_TIMESTAMP?and?ON UPDATE CURRENT_TIMESTAMPclauses in column definitions. The order of the clauses does not matter. If both are present in a column definition, either can occur first. Any of the synonyms for?CURRENT_TIMESTAMP?have the same meaning asCURRENT_TIMESTAMP. These are?CURRENT_TIMESTAMP(),?NOW(),?LOCALTIME,?LOCALTIME(),?LOCALTIMESTAMP, and?LOCALTIMESTAMP().
Use of?DEFAULT CURRENT_TIMESTAMP?and?ON UPDATE CURRENT_TIMESTAMP?is specific to?TIMESTAMP?andDATETIME. The?DEFAULT?clause also can be used to specify a constant (nonautomatic) default value; for example,DEFAULT 0?or?DEFAULT '2000-01-01 00:00:00'.
NoteThe following examples use?DEFAULT 0, a default that can produce warnings or errors depending on whether strict SQL mode or the?NO_ZERO_DATE?SQL mode is enabled. Be aware that the?TRADITIONAL?SQL mode includes strict mode and?NO_ZERO_DATE. See?Section?5.1.7, “Server SQL Modes”.
TIMESTAMP?or?DATETIME?column definitions can specify the current timestamp for both the default and auto-update values, for one but not the other, or for neither. Different columns can have different combinations of automatic properties. The following rules describe the possibilities:
-
With both?DEFAULT CURRENT_TIMESTAMP?and?ON UPDATE CURRENT_TIMESTAMP, the column has the current timestamp for its default value and is automatically updated to the current timestamp.
CREATE TABLE t1 (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -
With a?DEFAULT?clause but no?ON UPDATE CURRENT_TIMESTAMP?clause, the column has the given default value and is not automatically updated to the current timestamp.
The default depends on whether the?DEFAULT?clause specifies?CURRENT_TIMESTAMP?or a constant value. WithCURRENT_TIMESTAMP, the default is the current timestamp.
CREATE TABLE t1 (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,dt DATETIME DEFAULT CURRENT_TIMESTAMP );With a constant, the default is the given value. In this case, the column has no automatic properties at all.
CREATE TABLE t1 (ts TIMESTAMP DEFAULT 0,dt DATETIME DEFAULT 0 ); -
With an?ON UPDATE CURRENT_TIMESTAMP?clause and a constant?DEFAULT?clause, the column is automatically updated to the current timestamp and has the given constant default value.
CREATE TABLE t1 (ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP ); -
With an?ON UPDATE CURRENT_TIMESTAMP?clause but no?DEFAULT?clause, the column is automatically updated to the current timestamp but does not have the current timestamp for its default value.
The default in this case is type dependent.?TIMESTAMP?has a default of 0 unless defined with the?NULL?attribute, in which case the default is?NULL.
CREATE TABLE t1 (ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- default 0ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL );DATETIME?has a default of?NULL?unless defined with the?NOT NULL?attribute, in which case the default is 0.
CREATE TABLE t1 (dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP, -- default NULLdt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0 );
TIMESTAMP?and?DATETIME?columns have no automatic properties unless they are specified explicitly, with this exception: By default, the?first?TIMESTAMP?column has both?DEFAULT CURRENT_TIMESTAMP?and?ON UPDATE CURRENT_TIMESTAMP?if neither is specified explicitly. To suppress automatic properties for the first?TIMESTAMPcolumn, use one of these strategies:
-
Enable the?explicit_defaults_for_timestamp?system variable. If this variable is enabled, the?DEFAULT CURRENT_TIMESTAMP?and?ON UPDATE CURRENT_TIMESTAMP?clauses that specify automatic initialization and updating are available, but are not assigned to any?TIMESTAMP?column unless explicitly included in the column definition.
-
Alternatively, if?explicit_defaults_for_timestamp?is disabled (the default), do either of the following:
-
Define the column with a?DEFAULT?clause that specifies a constant default value.
-
Specify the?NULL?attribute. This also causes the column to permit?NULL?values, which means that you cannot assign the current timestamp by setting the column to?NULL. Assigning?NULL?sets the column to?NULL.
-
Consider these table definitions:
CREATE TABLE t1 (ts1 TIMESTAMP DEFAULT 0,ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t2 (ts1 TIMESTAMP NULL,ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t3 (ts1 TIMESTAMP NULL DEFAULT 0,ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP);The tables have these properties:
-
In each table definition, the first?TIMESTAMP?column has no automatic initialization or updating.
-
The tables differ in how the?ts1?column handles?NULL?values. For?t1,?ts1?is?NOT NULL?and assigning it a value ofNULL?sets it to the current timestamp. For?t2?and?t3,?ts1?permits?NULL?and assigning it a value of?NULL?sets it toNULL.
-
t2?and?t3?differ in the default value for?ts1. For?t2,?ts1?is defined to permit?NULL, so the default is also?NULL?in the absence of an explicit?DEFAULT?clause. For?t3,?ts1?permits?NULL?but has an explicit default of 0.
If a?TIMESTAMP?or?DATETIME?column definition includes an explicit fractional seconds precision value anywhere, the same value must be used throughout the column definition. This is permitted:
CREATE TABLE t1 (ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) );This is not permitted:
CREATE TABLE t1 (ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3) );Automatic Timestamp Properties Before MySQL 5.6.5
Before MySQL 5.6.5, support for automatic initialization and updating is more limited:
-
DEFAULT CURRENT_TIMESTAMP?and?ON UPDATE CURRENT_TIMESTAMP?cannot be used with?DATETIME?columns.
-
DEFAULT CURRENT_TIMESTAMP?and?ON UPDATE CURRENT_TIMESTAMP?can be used with at most one?TIMESTAMPcolumn per table. It is not possible to have the current timestamp be the default value for one column and the auto-update value for another column.
You can choose whether to use these properties and which?TIMESTAMP?column should have them. It need not be the first one in a table that is automatically initialized or updated to the current timestamp. To specify automatic initialization or updating for a different?TIMESTAMP?column, you must suppress the automatic properties for the first one, as previously described. Then, for the other?TIMESTAMP?column, the rules for the?DEFAULT?and?ON UPDATE?clauses are the same as for the first?TIMESTAMP?column, except that if you omit both clauses, no automatic initialization or updating occurs.
TIMESTAMP Initialization and the NULL Attribute
By default,?TIMESTAMP?columns are?NOT NULL, cannot contain?NULL?values, and assigning?NULL?assigns the current timestamp. To permit a?TIMESTAMP?column to contain?NULL, explicitly declare it with the?NULL?attribute. In this case, the default value also becomes?NULL?unless overridden with a?DEFAULT?clause that specifies a different default value.?DEFAULT NULL?can be used to explicitly specify?NULL?as the default value. (For a?TIMESTAMPcolumn not declared with the?NULL?attribute,?DEFAULT NULL?is invalid.) If a?TIMESTAMP?column permits?NULLvalues, assigning?NULL?sets it to?NULL, not to the current timestamp.
The following table contains several?TIMESTAMP?columns that permit?NULL?values:
CREATE TABLE t (ts1 TIMESTAMP NULL DEFAULT NULL,ts2 TIMESTAMP NULL DEFAULT 0,ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP );A?TIMESTAMP?column that permits?NULL?values does?not?take on the current timestamp at insert time except under one of the following conditions:
-
Its default value is defined as?CURRENT_TIMESTAMP?and no value is specified for the column
-
CURRENT_TIMESTAMP?or any of its synonyms such as?NOW()?is explicitly inserted into the column
In other words, a?TIMESTAMP?column defined to permit?NULL?values auto-initializes only if its definition includesDEFAULT CURRENT_TIMESTAMP:
CREATE TABLE t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);If the?TIMESTAMP?column permits?NULL?values but its definition does not include?DEFAULT CURRENT_TIMESTAMP, you must explicitly insert a value corresponding to the current date and time. Suppose that tables?t1?and?t2?have these definitions:
CREATE TABLE t1 (ts TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00'); CREATE TABLE t2 (ts TIMESTAMP NULL DEFAULT NULL);To set the?TIMESTAMP?column in either table to the current timestamp at insert time, explicitly assign it that value. For example:
INSERT INTO t1 VALUES (NOW()); INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);?
轉載于:https://www.cnblogs.com/davidwang456/p/4747069.html
總結
以上是生活随笔為你收集整理的mysql 表设计时的update_time自动更新的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8月之生活杂记
- 下一篇: mysql 压力测试之批量插入自增字段不