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';
KINGBASE研究院