1. 程式人生 > 其它 >KingbaseES如何更改現有表的主鍵

KingbaseES如何更改現有表的主鍵

更改主鍵

假設您必須更改現有表的主鍵。您可以通過執行以下語句來實現此目的:

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';