Mysql 强制液化为当前_时间戳,而不是现在()
在MySQL中使用liquibase核心:3.6.3。 这是我第一次必须为列使用时间戳(3),而不是默认时间戳。由于我的时间戳列不可为空,如果未设置默认值,则添加当前的_时间戳(直接在MySQL中或使用liquibase) 我面临的问题不是liquibase生成的SQL不使用当前的_TIMESTAMP,而是NOW()作为要调用的默认函数。这使得时间戳(3)不可能 有没有办法强制liquibase在输出中使用当前的_时间戳而不是现在() 输出:Mysql 强制液化为当前_时间戳,而不是现在(),mysql,timestamp,liquibase,liquibase-hibernate,liquibase-sql,Mysql,Timestamp,Liquibase,Liquibase Hibernate,Liquibase Sql,在MySQL中使用liquibase核心:3.6.3。 这是我第一次必须为列使用时间戳(3),而不是默认时间戳。由于我的时间戳列不可为空,如果未设置默认值,则添加当前的_时间戳(直接在MySQL中或使用liquibase) 我面临的问题不是liquibase生成的SQL不使用当前的_TIMESTAMP,而是NOW()作为要调用的默认函数。这使得时间戳(3)不可能 有没有办法强制liquibase在输出中使用当前的_时间戳而不是现在() 输出:创建表db\u name.TABLE\u name(i
创建表db\u name.TABLE\u name(id INT unsigned NOT NULL,updated timestamp DEFAULT NOW()NOT NULL,CONSTRAINT PK\u RULE\u STATE主键(id))代码>
这个很好用。但是,将时间戳更改为时间戳(3)
输出:创建表db\u name.TABLE\u name(id INT unsigned NOT NULL,updated timestamp(3)DEFAULT NOW()NOT NULL,CONSTRAINT PK\u RULE\u STATE PRIMARY KEY(id))代码>其中NOW()不是有效值
使用defaultValueDate
如果我使用defaultValue:current_timestamp()
liquibase足够聪明,可以在不使用文本字符串的情况下将其检测为函数,但是,这仍然是timestamp(3)的无效值。最后,使用
- changeSet:
id: xxx
author: xxx
changes:
- createTable:
tableName: table_name
columns:
- column:
name: id
type: int unsigned
autoIncrement: false
constraints:
primaryKey: true
- column:
name: updated
type: timestamp(3)
defaultValue: current_timestamp(3)
constraints:
nullable: false
生成输出:
CREATE TABLE db_name.TABLE_name(id INT unsigned NOT NULL,updated timestamp(3)缺省值'current_timestamp(3)'NOT NULL,CONSTRAINT PK_RULE_STATE主键(id))代码>
我最后的机会是根本不设置默认值。除了MySQL在更新当前时间戳(3)
时添加了,我无法避免它之外,这一切都很好
那么,有没有办法强制使用当前时间戳(3)或作为备份计划,以防止MySQL在更新时生成
部分?如果查看liquibase repositoy中的数据库配置,您会发现确实NOW()
被设置为MySQL的CurrentDateTimeFunction
public MySQLDatabase() {
super.setCurrentDateTimeFunction("NOW()");
...
}
因此,强制当前_时间戳(3)的一种方法是基于MySQLDatabase
使用自定义的liquibase.database.database
实现:
public class CustomMySQLDatabase extends MySQLDatabase {
public CustomMySQLDatabase() {
super();
super.setCurrentDateTimeFunction("CURRENT_TIMESTAMP(3)");
}
...
之后,您可以在调用liquibase时使用CustomMySQLDatabase
as--databaseClass参数。您可以使用modifySql
命令和replace
选项将自动生成的NOW()
替换为当前的\u时间戳(3)
(或者你需要的任何东西)
从文档中:
…有时,生成的SQL需要与您的特定需要略有不同
有关更多详细信息,请参见此处:如中所述,您可以使用valueNOW(3)
作为defaultValueComputed
,如以下示例所示:
然后,结果如下所示:
mysql> SHOW COLUMNS FROM myTable;
+-----------+---------------+------+-----+----------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+----------------------+-------------------+
| DateTime | timestamp(3) | NO | | CURRENT_TIMESTAMP(3) | DEFAULT_GENERATED |
+-----------+---------------+------+-----+----------------------+-------------------+
mysql> SHOW COLUMNS FROM myTable;
+-----------+---------------+------+-----+----------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+----------------------+-------------------+
| DateTime | timestamp(3) | NO | | CURRENT_TIMESTAMP(3) | DEFAULT_GENERATED |
+-----------+---------------+------+-----+----------------------+-------------------+