簡體   English   中英

自動生成時間戳列(主鍵)到現有表 DB2

[英]Autogenerated timestamp column( primary key) to existing table DB2

是否可以使用 alter 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)時間戳數據類型作為主鍵是不明智的,因為它會使預先存在的行的設置值變得更加尷尬,並使日期算術變得不可能。

數據類型 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;

您可以使用 CURRENT_TIMESTAMP 而不是 timestamp(generate_unique())

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

你可以在這里測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM