Значение по умолчанию для обновления 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 в при?.