0

次のような状況があります。

  1. 既存のテーブルを持つ
  2. を使用して新しい列を追加する必要があります
  3. 列のタイプは TIMESTAMP です

コード:

<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 は新しい行に対してのみ設定する必要があります。

4

2 に答える 2

3

TIMESTAMPMySQLの列はデフォルトでデフォルト値にNOT NULLなり、その恐ろしいゼロの日付がデフォルト値になります(詳細についてはマニュアルを参照してください)。

これを回避する方法を確認できる唯一の方法は、生成された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がtimestampMySQLの癖を知らず、列をで埋める必要があるという明白なことを述べる必要はないと考えているためだと思いますNULL

編集

もちろん、これは新しい行では機能しないことを忘れました。Liquibaseを使用してデフォルト値を再適用するには、次の2つの方法があります。

CURRENT_TIMESTAMPデフォルト値を次のように変更する2番目のchangeSetを追加します。

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

またはDEFAULT NULL、列を追加するときに使用せずに、すべての(既存の)行をに戻すステートメントを実行しNULLます。。付きのsqlタグupdate foo set new_date = null

于 2012-11-22T14:54:37.820 に答える
0

もう一度、このコードを変更する必要があります。新しいタイムスタンプ列を作成する方法は同じですが、既存のすべての行は現在のタイムスタンプで変更し、更新中に一度だけ変更する必要がありますが、すべての新しい行は作成タイムスタンプである必要があります。コード:

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

このコードは、既存のすべての行に対してタイム スタンプが 0000-00-00 の列を作成します。

于 2012-12-21T09:18:53.003 に答える