自动生成时间戳列(主键)到现有 table DB2

Autogenerated timestamp column( primary key) to existing table DB2

是否可以使用 alter table 将自动生成的主键列(时间戳)添加到现有 table?

类似这样但无法编译

ALTER TABLE DB2ADMIN.xxxyyyy ADD COLUMN ID TIMESTAMP NOT NULL WITH DEFAULT timestamp(generate_unique())@

准备期间出错 42601(-104)[IBM][CLI 驱动程序][DB2/AIX64] SQL0104N 在“OT NULL WITH DEFAULT”之后发现意外的标记“timestamp”。预期的标记可能包括:“CHECK”。 SQLSTATE=42601

使用伪造的(来自 generate_unique)时间戳数据类型作为主键是不明智的,因为它会使 pre-existing 行的设置值更加尴尬,并且无法进行日期运算。

TIMESTAMP 数据类型更适合real dates/times 因为这样你可以使用日期算法,这对业务很实用。如果你的假 timestamp-column 中的值来自 generate-unique 那么你就不能明智地使用日期算法。

如果您尝试使用真实的时间戳值(而不是 generate_unique),例如 current timestamp,那么您可能会发生冲突,具体取决于 insert-rate。通常这是个坏主意。这也使得任何 pre-existing 行的设置值变得更加困难。

使用自动生成的标识列作为代理主键通常更容易、更快捷,尤其是在 table 已经有数据的情况下。

这是执行此操作的典型方法,它适用于 Db2-LUW 以及旧版本的 Db2。更高版本的 Db2 可以使用其他方法。

首先您需要验证 table 还没有主键,因为每个 table 最多只能有一个主键。

接下来,检查 table 是否已经在 NOT NULL 列上具有唯一索引,因为如果存在这样的列,则可以将其提升为主键列。

如果以上都不存在,那么您可以使用类似下面的逻辑来添加自动生成的列,在任何现有行中设置唯一值,并确保任何未来的插入自动在列中获得唯一值而无需应用干预。

alter table myschema.mytab add column id bigint not null default 0 ;

alter table myschema.mytab alter column id drop default ;

alter table myschema.mytab alter column id set generated always as identity ;

update myschema.mytab set id = default ;

alter table myschema.mytab add constraint pkey primary key(id) ;

reorg table myschema.mytab ;

runstats on table myschema.mytab with distribution and detailed indexes all;

您可以使用 CURRENT_TIMESTAMP 代替时间戳(generate_unique())

ALTER TABLE sellers ADD COLUMN ID TIMESTAMP NOT NULL WITH DEFAULT CURRENT_TIMESTAMP

You can test here