在YugabyteDB部署Keycloak时删除主键约束报错求助
解决Keycloak + YugabyteDB的Liquibase主键删除错误
这个问题的核心是YugabyteDB当前不支持直接删除主键约束——因为主键和它的分布式分片存储逻辑深度绑定,直接删除会破坏数据一致性。下面是几个可行的解决办法:
跳过目标Liquibase变更集
找到Keycloak里执行ALTER TABLE public.USER_REQUIRED_ACTION DROP CONSTRAINT CONSTRAINT_2的那个Liquibase变更集,直接标记为已执行:- 登录YugabyteDB,查询
DATABASECHANGELOG表,定位到对应变更集的ID和AUTHOR - 往
DATABASECHANGELOG表插入一条记录,将该变更集的状态设为EXECUTED,Liquibase后续就会跳过这个变更
- 登录YugabyteDB,查询
用表重建替代主键删除逻辑
如果这个变更集是为了调整主键结构,把原有的DROP语句替换成以下步骤:-- 创建新表,定义好调整后的主键结构 CREATE TABLE public.USER_REQUIRED_ACTION_NEW ( USER_ID VARCHAR(255) NOT NULL, ACTION VARCHAR(255) NOT NULL, CREATED_TIMESTAMP BIGINT NOT NULL, PRIMARY KEY (USER_ID, ACTION) ); -- 迁移原表数据到新表 INSERT INTO public.USER_REQUIRED_ACTION_NEW SELECT * FROM public.USER_REQUIRED_ACTION; -- 删除原表 DROP TABLE public.USER_REQUIRED_ACTION; -- 把新表重命名为原表名 ALTER TABLE public.USER_REQUIRED_ACTION_NEW RENAME TO USER_REQUIRED_ACTION;然后修改对应的Liquibase变更集文件,用上述SQL替换原来的删除主键语句。
升级Keycloak到适配版本
部分较新的Keycloak版本已经针对YugabyteDB做了适配,调整了Liquibase脚本以规避不支持的语法。可以核对官方文档确认版本兼容性后升级。
内容的提问来源于stack exchange,提问作者dh YB
相关产品推荐
相关产品推荐

