KingbaseES如何更改現有表的主鍵
阿新 • • 發佈:2022-04-22
更改主鍵
假設您必須更改現有表的主鍵。您可以通過執行以下語句來實現此目的:
ALTER TABLE tablename
DROP CONSTRAINT tablename_pkey ,
ADD PRIMARY KEY (column_newkey);
如果主鍵在其他表中用作外來鍵,則可以新增該關鍵字。這將自動刪除依賴於主鍵的任何外來鍵:CASCADE
ALTER TABLE tablename
DROP CONSTRAINT tablename_pkey CASCADE,
ADD PRIMARY KEY (column_newkey);
當然,在此之後,您仍然必須重新建立已刪除的外來鍵。
預設情況下,KingbaseES還會為每個主鍵建立並維護一個索引。
安全地更改主鍵
如果您需要在KingbaseES資料庫中的大型表(約1億條記錄)上更改主鍵列。不能鎖定表,因為這是高度事務性的資料庫,不能阻止表上的 DML 語句的情況下,安全地更改主鍵的正確方法是什麼?
您可以併發建立唯一索引,在建立索引時,選項concurrently
允許對錶進行讀取和寫入訪問。但是,併發構建索引比沒有該選項,將花費更長的時間。
create unique index concurrently tablename_column_newkey on tablename (column_newkey);
建立索引後,可以將其用作主鍵:
alter table tablename
add primary key using index tablename_column_newkey;
這隻會在很短的時間內鎖定表。
最後,修改主鍵索引名稱,
alter index tablename_column_newkey rename to tablename_pkey;
使用預設名稱,便於識別表、約束和唯一索引之間的關係。
檢視約束外來鍵
要檢視哪些外來鍵指向有問題的特定表,您可以順便使用以下語句:
SELECT tc.table_schema, tc.constraint_name, tc.table_name, kcu.column_name, ccu.table_schema AS foreign_table_schema, ccu.table_name AS foreign_table_name, ccu.column_name AS foreign_column_name FROM information_schema.table_constraints AS tc JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name AND ccu.table_schema = tc.table_schema WHERE tc.constraint_type = 'FOREIGN KEY' AND ccu.table_name = 'tablename';