Apache-AGE创建标签报错已存在,如何修改查询仅在不存在时执行?
解决Apache-AGE标签已存在时的创建问题
当执行SELECT create_vlabel('testdb', 'cities');因标签已存在报错时,可通过以下两种方式实现仅当目标标签不存在时才创建的逻辑:
方式一:直接使用DO块执行条件判断
利用Apache-AGE内置的ag_labels系统表(存储图标签元数据)检查标签是否存在,通过DO块执行条件创建逻辑:
DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM ag_labels WHERE label_name = 'cities' AND graph_name = 'testdb' ) THEN PERFORM create_vlabel('testdb', 'cities'); RAISE NOTICE '标签cities已创建'; ELSE RAISE NOTICE '标签cities已存在,无需创建'; END IF; END $$;
方式二:封装为可复用函数
如果需要多次使用该逻辑,可以封装成PL/pgSQL函数:
CREATE OR REPLACE FUNCTION create_vlabel_if_not_exists(graph_name text, label_name text) RETURNS void AS $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM ag_labels WHERE label_name = $2 AND graph_name = $1 ) THEN PERFORM create_vlabel($1, $2); RAISE NOTICE '标签 % 在图 % 中已创建', $2, $1; ELSE RAISE NOTICE '标签 % 在图 % 中已存在', $2, $1; END IF; END $$ LANGUAGE plpgsql;
调用函数执行创建:
SELECT create_vlabel_if_not_exists('testdb', 'cities');
说明
ag_labels表的graph_name字段对应目标图名称,label_name字段对应标签名称,通过这两个字段的组合可以精准定位目标标签。- 使用
PERFORM代替SELECT调用create_vlabel,避免在DO块或函数中返回不必要的结果集。
内容的提问来源于stack exchange,提问作者Kamlesh Kumar
相关产品推荐
相关产品推荐

