我有这样的情况:
代码:
<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应仅为新行设置。
答案 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时间戳的列。