2013-10-07 51 views
4

我正在使用Liquibase生成MySQL和HSQLDB數據庫。
在幾個表中,我有一個名爲'last_modified'的列,它是該特定記錄上最後更新的TIMESTAMP。
默認值開啓更新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定義爲BEFORE UPDATE,並在每次更新行時設置時間戳。

更新:從HSQLDB版本2.3.4開始支持此功能。例如:CREATE TABLE T1(ID INT, last_modified timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL)。請注意,在DEFAULT和ON UPDATE子句之後必須出現NOT NULL約束。

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不會產生上述你。我必須處理它以上給出