首页 > 解决方案 > 自动生成到现有表 DB2 的时间戳列(主键)

问题描述

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

像这样的东西,但它不编译

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

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

标签: sqldb2

解决方案


使用假的(来自 generate_unique)时间戳数据类型作为主键是不明智的,因为它使为预先存在的行设置值更加尴尬,并且使日期算术变得不可能。

数据类型 TIMESTAMP 更适合实际日期/时间,因为这样您就可以使用日期算术,这对业务很实用。如果你的假时间戳列中的值来自,generate-unique那么你就不能明智地使用日期算术。

如果您尝试使用真正的时间戳值(而不是 generate_unique),current timestamp那么您可能会遇到冲突,具体取决于插入率。通常这是个坏主意。这也使得为任何预先存在的行设置值更加困难。

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

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

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

接下来,检查表是否已经在 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;

推荐阅读