【发布时间】:2020-07-06 15:08:14
【问题描述】:
我需要帮助来完成以下要求:
- [x]
Profile带有列的表id,username, ... - [x]
Comment带有列的表id,content, ... - [x]
CommentReference带有列的表id,profile_id,comment_id, ...
创建新评论时,插入前:
- [ ] 检查
NEW.content是否引用了用户名,例如@someusername - [ ] 检查配置文件表中是否存在每个引用
- [ ] 对于存在的引用,插入到
CommentReferences配置文件和评论
目前,我有以下代码:
PS:以下代码有错误,我需要帮助修复它。我正在使用 postgres 版本 12。
CREATE FUNCTION create_comment_usernames_references()
RETURNS trigger AS $$
DECLARE usernames TEXT[];
DECLARE username TEXT;
DECLARE profile_id TEXT; -- profile_id is of type uuid, is it correct to use TEXT here?
BEGIN
-- verify if there are usernames in the comment.content with the username regex
SELECT DISTINCT(
regexp_matches(
NEW.content,
'@(([a-z0-9]*((?<=[a-z0-9])[-|_|\.](?=[a-z0-9]))[a-z0-9]*)*|[a-z0-9]*)',
'g'
)
)[1]
INTO usernames;
FOREACH username IN ARRAY usernames LOOP
SELECT (SELECT id FROM "public"."Profile" WHERE "username" = username) INTO profile_id
INSERT INTO "public"."CommentReference" (comment_id, profile_id) VALUES (NEW.id, profile_id);
END LOOP;
-- return nothing
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER create_comment_usernames_references_trigger
BEFORE INSERT OR UPDATE ON "public"."Comment"
FOR EACH ROW
EXECUTE PROCEDURE create_comment_usernames_references();
【问题讨论】:
-
你看到了什么错误?
-
@kofemann 我在 hasura 控制台中运行它,错误输出不是很有帮助,而且我不是 SQL 专家,它只是说在
INSERT附近或处有一些错误@ -
第一个猜测是在插入之前检查 SELECT 是否返回了一些值,例如 IF FOUND THEN....*跨度>
-
@kofemann 我认为
profile _id存在一些问题,它是表格格式,所以我想我需要在插入之前从profile_id中提取id,但不确定这个怎么做。另外,我当然需要添加 IF 语句。
标签: sql postgresql postgresql-12