Значение по умолчанию для обновления Liquibase

Я использую Liquibase для генерации баз данных MySQL и HSQLDB.
в нескольких таблицах у меня есть столбец под названием "last_modified", который является меткой времени последнего обновления этой конкретной записи.

<changeSet author="bob" id="7">
    <createTable tableName="myTable">
        <column autoIncrement="true" name="id" type="INT">
            <constraints nullable="false" primaryKey="true" />
        </column>
        <column name="name" type="VARCHAR(128)">
            <constraints nullable="false" />
        </column>
        <column name="description" type="VARCHAR(512)" />
        <column defaultValueBoolean="true" name="enabled" type="BIT">
            <constraints nullable="false" />
        </column>
        <column name="last_modified" type="TIMESTAMP"/>
    </createTable>
    <modifySql dbms="mysql">
        <append value=" engine innodb" />
    </modifySql>
</changeSet>

Я заметил, что если я использую MySQL, сгенерированный SQL для этого столбца:

`last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

хотя, если я использую HSQLDB, в случае обновления ничего не происходит, но я хотел бы иметь такое же поведение базы данных MySQL со значением по умолчанию на обновление равен ТЕКУЩАЯ_ОТМЕТКА_ВРЕМЕНИ.

Как установить CURRENT_TIMESTAMP в качестве значения по умолчанию при обновлении?

3 ответов


вы не можете сделать это со значением по умолчанию. Поведение MySQL нестандартно и не поддерживается другими базами данных. Правильный способ сделать это-с триггером, который определен как до обновления и устанавливает метку времени каждый раз, когда строка обновляется.

Update: от HSQLDB версии 2.3.4 эта функция поддерживается. Например: CREATE TABLE T1(ID INT, last_modified timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL). Примечание. ограничение NOT NULL должно появиться после предложения по умолчанию и на UPDATE.


или вы могли бы попробовать это, так как у вас уже есть modifySql тег добавлено:

<column defaultValue="CURRENT_TIMESTAMP"
             name="timestamp"
             type="TIMESTAMP">
            <constraints nullable="false"/>
 </column>
<modifySql dbms="mysql">
    <regExpReplace replace="'CURRENT_TIMESTAMP'" with="CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"/>
    <append value=" engine innodb" />
</modifySql>

при 3.1.1 не производит то, что вы описали выше. Я должен иметь дело с этим, как указано выше


мы используем при Для точно такой же случай. Вы захотите сделать триггер обновления, как описал fredt. В противном случае вы не можете быть уверены, что обновление произойдет на других базах данных, кроме MySQL. Тег изменений в журнал что-то вроде этого:

<sql splitStatements="false">
  CREATE TRIGGER update_${tableName}_trg
    BEFORE UPDATE ON ${tableName}
      FOR EACH ROW BEGIN
        SET NEW.updated_at = NOW();
      END
</sql>

также, у меня есть вопрос на переполнение стека о том, как отрефакторить этот код вы можете увидеть на как вы рефакторинг похожий код и предоставить params в при?.