2013-10-07 4 views
4

Я использую Liquibase для генерации баз данных MySQL и HSQLDB.
В нескольких таблицах у меня есть столбец «last_modified», который является TIMESTAMP последнего обновления этой конкретной записи.
Значение по умолчанию ON UPDATE Liquibase

<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.

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

ответ

4

Вы не можете сделать это со значением по умолчанию. Поведение MySQL является нестандартным и не поддерживается другими базами данных. Правильный способ сделать это с помощью TRIGGER, который определяется как ПЕРЕД ОБНОВЛЕНИЕМ и устанавливает метку времени каждый раз, когда строка обновляется.

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

3

Мы фактически используем Liquibase для того же самого прецедента. Вы хотите создать триггер обновления, как описано в 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> 

Кроме того, у меня есть вопрос о переполнении стека о том, как реорганизовать часть этого кода вы можете увидеть на How do you refactor similar looking code and provide params in Liquibase?.

2

Или вы могли бы попробовать это, как у вас есть уже 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> 

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

Смежные вопросы