DB2 for IBMi环境SQLRPGLE中删除表外键约束问题咨询
关于DB2 for IBMi删除表外键约束的问题解答
可行性说明
在SQLRPGLE程序运行时删除DB2 for IBMi表的外键约束完全可行,只需要执行操作的用户持有对应表的ALTER权限即可。
报错原因分析
你收到的报错是因为DROP FOREIGN KEY语法后需要跟外键约束的名称,而非外键关联的字段名。你在建表时没有为外键指定自定义名称,DB2会自动生成一串符合系统规则的约束名,直接填字段名action_code_details_id自然找不到对应约束。
解决步骤
- 第一步:查询表的外键约束名称
执行以下SQL查询IESQAFILE库下grid_action_details表的所有外键约束信息:
SELECT fk.constraint_name, fk.colname FROM sysibm.sqlforeignkeys fk WHERE fk.tbschema = 'IESQAFILE' AND fk.tblname = 'GRID_ACTION_DETAILS';
查询结果里CONSTRAINT_NAME字段的值就是你需要的外键约束名,通常是SQL加时间戳加随机数的格式,比如SQL240101123456789。
- 第二步:执行正确的删约束语句
把上一步查到的约束名替换到语句中即可:
ALTER TABLE iesqafile.grid_action_details DROP FOREIGN KEY 你查到的约束名;
优化建议
如果后续需要经常操作外键约束,建议在建表时就为外键指定自定义的约束名,示例如下:
create table grid_action_details( id integer not null generated always as identity (start with 1 increment by 1) PRIMARY KEY, grid_details_id integer, -- 自定义外键约束名 constraint fk_gad_grid_details foreign key(grid_details_id) references grid_details(id), action_code_details_id integer, constraint fk_gad_action_code foreign key(action_code_details_id) references action_code_details(id), action_code_status varchar(2), created_date date default current_date, created_by varchar(30), last_updated_date date default current_date, updated_by varchar(30), required_parameter clob );
后续删除该外键时直接用自定义名称即可,不需要再查询系统表:
ALTER TABLE iesqafile.grid_action_details DROP FOREIGN KEY fk_gad_action_code;
SQLRPGLE执行注意事项
在SQLRPGLE中执行ALTER这类DDL语句时,需要用动态SQL的EXECUTE IMMEDIATE语法执行,不要写静态SQL,避免编译阶段就触发DDL操作报错,示例代码:
dcl-s alter_stmt varchar(256); // 拼接ALTER语句,约束名可以用变量动态传入 alter_stmt = 'ALTER TABLE iesqafile.grid_action_details DROP FOREIGN KEY fk_gad_action_code'; exec sql execute immediate :alter_stmt;
内容的提问来源于stack exchange,提问作者theju112t
相关产品推荐
相关产品推荐

