需要使用TIMESTAMP类型创建列,但不更新现有行

时间:2012-11-22 14:16:26

标签: java mysql sql liquibase

我有这样的情况:

  1. 有现有表格
  2. 需要使用
  3. 添加新列
  4. 列的类型是TIMESTAMP
  5. 代码:

    <changeSet author="name" id="bla-bla-bla">
        <addColumn tableName="table_name">
            <column name="new_col_name" type="TIMESTAMP"/>
        </addColumn>
    </changeSet>
    

    此代码创建列,其酷!但!它还将所有现有行的默认值设置为0000-00-00 00:00:00。

    但我需要保留所有现有行而不做任何更改。 TIMESTAMPS应仅为新行设置。

2 个答案:

答案 0 :(得分:3)

MySQL中的TIMESTAMP列默认为NOT NULL,并且可以将零日期视为默认值(See the manual以获取详细信息)。

我能看到如何避免这种情况的唯一方法是修改生成的SQL以在变更集中包含DEFAULT NULL子句。

<addColumn tableName="foo">
    <column name="new_date" type="TIMESTAMP"/>
</addColumn>
<modifySql>
     <replace replace="TIMESTAMP" with="TIMESTAMP NULL DEFAULT NULL"/>
</modifySql>

指定defaultValueDate =“NULL”似乎不起作用。我想这是因为Liquibase不知道MySQL的timestamp怪癖,并且认为没有必要说明显而易见的事情 - 列应填充NULL

修改

我忘记了这对新行当然不适用。有两种方法可以使用Liquibase重新应用默认值:

添加第二个changeSet,将默认值更改为CURRENT_TIMESTAMP

<sql>
     alter table foo modify new_date timestamp null default current_timestamp
</sql>

或者在添加列时不使用DEFAULT NULL,而是运行将所有(现有)行设置回NULL的语句。标有sql的{​​{1}}代码。

答案 1 :(得分:0)

再一次,我需要修改这段代码。 这个想法是一样的,如何创建新的Timestamp列,但是所有现有的行应该用当前时间戳修改,在更新期间只修改一次,但所有新行都应该有创建时间戳。 代码:

<changeSet author="name" id="bla-bla-bla">
    <addColumn tableName="table_name">
        <column name="new_col_name" type="TIMESTAMP"/>
    </addColumn>
</changeSet>

此代码为所有现有行创建带有0000-00-00时间戳的列。