Google Cloud Spanner 是否支持默认列值?

Does Google Cloud Spanner support default column values?

能够将 UTC 时间戳计算为列的默认值是大多数流行数据库解决方案的一项便利功能。 Google Cloud Spanner 支持吗?如果不是,这是一个可能的路线图项目吗?

Cloud Spanner 实际上不允许指定任何类型的默认值。这意味着隐式默认值为 Null 或 Error,具体取决于是否使用 NOT NULL

指定了列

Cloud Spanner 在内部存储了行提交时间的 'timestamp',但不会直接公开。它的行为也不像默认值(设置一次),所以很遗憾,您的问题目前的答案是否定的。

绝对值得团队考虑。

有能力获得commit timestamp in the Spanner table.

基本步骤是:

  • 创建类型为 TIMESTAMP 的列,并在模式定义中将列选项 allow_commit_timestamp 设置为 true: my column TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)

  • 在您的 DML 插入或更新中,使用 PENDING_COMMIT_TIMESTAMP() 函数写入提交时间戳。

  • 在突变中,使用spanner.commit_timestamp()

April 2022 release notes 开始,Cloud Spanner 现在支持列的默认值。

所以这个模式可以工作:

CREATE TABLE foo (
  fooUUID STRING(36) NOT NULL,
  created TIMESTAMP DEFAULT (CURRENT_TIMESTAMP())
) PRIMARY KEY (fooUUID);

INSERT INTO foo (fooUUID) VALUES ('bar');

SELECT * FROM foo;
#result:
fooUUID     created
bar         2022-05-12T15:08:39.164778107Z

默认值不适用于第一个示例中的提交时间戳。

此处提供了这些以及其他 limitations around timestamp columns

A column with a default value can't be a commit timestamp column. PENDING_COMMIT_TIMESTAMP() can't be used as a default value. SET OPTIONS (allow_commit_timestamp = true) is disallowed.

如果您尝试根据其他列值创建生成列:

The expression can't contain non-deterministic functions such as PENDING_COMMIT_TIMESTAMP(), CURRENT_DATE(), and CURRENT_TIMESTAMP().