2

将 liquibase-core:3.6.3 与 MySQL 一起使用。

我第一次必须对列使用时间戳(3)而不是默认时间戳。由于我的时间戳列不可为空,如果未设置 DEFAULT 值,则添加 current_timestamp(直接在 MySQL 中或使用 liquibase)。

不是我面临 liquibase 生成的 SQL 不使用 CURRENT_TIMESTAMP 但 NOW() 作为要调用的默认函数的问题。这使得时间戳(3)不可能。

有没有办法强制 liquibase 在输出中使用 CURRENT_TIMESTAMP 而不是 NOW()?

- 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
                  defaultValueComputed: current_timestamp
                  constraints:
                    nullable: false

输出: CREATE TABLE db_name.table_name(id INT unsigned NOT NULL, updated timestamp DEFAULT NOW() NOT NULL, CONSTRAINT PK_RULE_STATE PRIMARY KEY (id));

这工作正常。但是,更改timestamptimestamp(3)

输出: CREATE TABLE db_name.table_name(id INT unsigned NOT NULL, updated timestamp(3) DEFAULT NOW() NOT NULL, CONSTRAINT PK_RULE_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) DEFAULT DEFAULT 'current_timestamp(3)' NOT NULL, CONSTRAINT PK_RULE_STATE PRIMARY KEY (id));

我最后的机会是根本没有设置默认值。这很好用,除了事实上,正如这个人很久以前所说的那样,MySQL 添加了ON UPDATE CURRENT_TIMESTAMP(3)并且我无法避免它。


那么,有没有办法强制使用 current_timestamp(3) 或作为备份计划,以防止 MySQL 生成该ON UPDATE部分?

4

3 回答 3

2

如果您查看 liquibase 存储库中的数据库配置,您会发现它确实NOW()设置currentDateTimeFuntion为 MySQL。

public MySQLDatabase() {
    super.setCurrentDateTimeFunction("NOW()");
    ...
}

因此,强制 current_timestamp(3) 的一种方法是使用liquibase.database.Database基于以下的自定义实现MySQLDatabase

public class CustomMySQLDatabase extends MySQLDatabase {

    public CustomMySQLDatabase() {
        super();
        super.setCurrentDateTimeFunction("CURRENT_TIMESTAMP(3)");
    }
    ...

CustomMySQLDatabase之后调用 liquibase 时可以使用as --databaseClass 参数。

于 2019-11-15T11:20:30.173 回答
1

除了自定义 liquibase 类,您可以使用modifySql带有选项的命令replace来替换自动生成NOW()CURRENT_TIMESTAMP(3)(或任何您需要的)。

从文档:

...有时生成的 SQL 需要根据您的特定需求略有不同

有关更多详细信息,请参见此处:https ://docs.liquibase.com/workflows/liquibase-community/modify-sql.html

于 2021-02-09T12:52:39.947 回答
0

本 GitHub 问题中所述,您可以在以下示例中使用类似的NOW(3)值:defaultValueComputed

<column defaultValueComputed="NOW(3)" name="DateTime" type="TIMESTAMP(3)">
    <constraints nullable="false" />
</column>

然后,结果如下:

mysql> SHOW COLUMNS FROM myTable;
+-----------+---------------+------+-----+----------------------+-------------------+
| Field     | Type          | Null | Key | Default              | Extra             |
+-----------+---------------+------+-----+----------------------+-------------------+
| DateTime  | timestamp(3)  | NO   |     | CURRENT_TIMESTAMP(3) | DEFAULT_GENERATED |
+-----------+---------------+------+-----+----------------------+-------------------+
于 2021-02-14T12:12:46.900 回答