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'; 
posted @ 2022-04-22 16:39  KINGBASE研究院  阅读(315)  评论(0编辑  收藏  举报