U0000002:GaussDB分布式不支持表外键约束
描述
数据库类型与版本
- 源库类型与版本:所有涉及外键约束的源数据库类型。
- 目标库类型与版本:GaussDB分布式版。
语法示例
默认情况下,UGO保留表外键约束不转换,并生成此错误提示。
GaussDB分布式不支持表外键约束,如下示例在GaussDB分布式中不支持。
CREATE TABLE ref_types ( dbtype VARCHAR(100) PRIMARY KEY, root_level_type VARCHAR(100) ); CREATE TABLE dbtype_objtype_map ( dbtype VARCHAR(100), object_type VARCHAR(100), is_supported INT, CONSTRAINT dbtype_objtype_map_fk_1 FOREIGN KEY (dbtype) REFERENCES ref_types(dbtype) ON DELETE CASCADE ON UPDATE RESTRICT );
改造建议
方案一:修改“外键约束”转换配置项。
方案二:参考如下示例,通过触发器来实现外键约束(仅包括数据依赖约束,不包括数据级联删除功能)。
CREATE TABLE dbtype_objtype_map ( dbtype VARCHAR(100), object_type VARCHAR(100), is_supported INT ); CREATE OR REPLACE FUNCTION dbtype_objtype_map_foreign_func() RETURN TRIGGER AS DECLARE reference_count INT; BEGIN SELECT count(dbtype) INTO reference_count FROM ref_types WHERE dbtype = NEW.dbtype; IF reference_count > 0 THEN RETURN NEW; ELSE RAISE EXCEPTION 'Cannot add or update a child row: a foreign key constraint fails '; END IF; END; CREATE TRIGGER dbtype_objtype_map_foreign_tri BEFORE UPDATE OR INSERT ON dbtype_objtype_map FOR EACH ROW EXECUTE PROCEDURE dbtype_objtype_map_foreign_func();
请注意,触发器无法等价外键约束,可能还会影响使用性能,并提升数据库系统的维护难度。建议您注释掉表外键,通过业务保证数据的完整性。