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

Posted

技术标签:

【中文标题】自动生成的时间戳列(主键)到现有表 DB2【英文标题】:Autogenerated timestamp column( primary key) to existing table DB2 【发布时间】:2020-10-15 12:49:48 【问题描述】:

是否可以使用 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

【问题讨论】:

TIMESTAMP 是保留字。用双引号括起来,如:ALTER TABLE DB2ADMIN.xxxyyyy ADD COLUMN ID "TIMESTAMP" NOT NULL WITH DEFAULT timestamp(generate_unique())@ 不过,我认为这是个坏主意。 PK 不会真正代表时间戳值,而是基于时间戳的值......不完全相同。在重负载下,这些值可能会稍微偏离日期/时间。 【参考方案1】:

使用伪造的(来自 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;

【讨论】:

OK tnx,我怀疑使用 int 或 timetamp 现在你说服了我。在我的情况下,尽管时间戳更方便。【参考方案2】:

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

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

You can test here

【讨论】:

"如果您尝试使用真正的时间戳值(而不是 generate_unique),例如当前时间戳,那么您可能会遇到冲突,具体取决于插入率。通常,这是个坏主意。” - @mao 我同意他的观点

以上是关于自动生成的时间戳列(主键)到现有表 DB2的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 将自动增量主键添加到现有表

sql 将自动递增主键添加到现有表

Oracle中如何将自动增量添加到现有表中

向oracle中的现有表添加自动增量主键[重复]

将自动增量主键插入现有表

将自动增量主键插入现有表