[英]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.