10

如何在 H2 数据库ON UPDATE中执行请求。CREATE TABLE

语境:

我正在使用 sql-maven-plugin (1.5) 在我的项目的 h2 数据库中生成一个表。

但是当我调用脚本 sql 时,我有一个org.h2.message.DbException.getJdbcSQLException.

我的脚本:

CREATE TABLE IF NOT EXISTS TEST(
  DATE timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
);
4

3 回答 3

6

H2 不支持“ON UPDATE”。但我想您可以改用计算列?:

CREATE TABLE IF NOT EXISTS TEST(
  DATE timestamp AS CURRENT_TIMESTAMP
);
于 2011-11-04T09:29:57.577 回答
4

H2 从版本 1.4.197(2018 年 3 月 18 日发布)开始支持“ON UPDATE” 来自问题的查询应该可以正常工作,因为这个在我们的项目中有效:

last_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

我发现感谢评论:

H2DB - CREATE TABLE 请求中的脚本 SQL ON UPDATE

H2DB - CREATE TABLE 请求中的脚本 SQL ON UPDATE

所以也请给他们投票。

细节:

于 2019-03-12T08:27:19.790 回答
2

添加到您的 SQL 文件:

CREATE TABLE IF NOT EXISTS my_table (
  `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TRIGGER my_trigger
  BEFORE UPDATE
  ON my_table
  FOR EACH ROW CALL "org.h2.trigger.UpdatedAtTrigger";

创建一个 Java 类并添加到您的测试类路径中:

package org.h2.trigger;

import java.sql.*;  
import java.time.Instant;
import org.h2.tools.TriggerAdapter;

public class UpdatedAtTrigger extends TriggerAdapter {

  @Override
  public void fire(Connection conn, ResultSet oldRow, ResultSet newRow) throws SQLException {
    newRow.updateTimestamp("updated_at", Timestamp.from(Instant.now()));
  }
}
于 2018-02-07T01:52:03.613 回答