更新时间:2025-06-04 GMT+08:00
分享

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();

请注意,触发器无法等价外键约束,可能还会影响使用性能,并提升数据库系统的维护难度。建议您注释掉表外键,通过业务保证数据的完整性。

相关文档