首页 > 解决方案 > 确保只有表中的现有用户可以在 PostgreSQL 中添加记录

问题描述

我有类似 fb 组的东西,人们可以在其中担任版主。如果用户想在某个组中添加版主,我想首先检查他自己是否是该组的版主。

目前该表如下所示:

CREATE TABLE fb_groups_moderators (
    fb_group_id int,
    user_id  bigint,
    
    PRIMARY KEY (fb_group_id, user_id),
    FOREIGN KEY (fb_group_id) references fb_groups (id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) references users (id) ON DELETE CASCADE
);

所以我不能这样做:

INSERT INTO fb_group_moderators (fb_group_id, user_id) VALUES (11, 123);

我需要检查调用此查询的用户实际上也是 fb_group_id = 11 的版主,只有这样他才能将用户 123 添加到该组中作为版主。

标签: sqlpostgresqlinner-joinsql-insert

解决方案


您需要将请求插入的用户的 ID 作为参数传递给查询。然后,您可以使用INSERT ... SELECT语法。

考虑:

INSERT INTO fb_group_moderators (fb_group_id, user_id) 
SELECT v.fb_group_id, v.user_id
FROM (VALUES (11, 123, ?)) v(fb_group_id, user_id, adding_user_id)
INNER JOIN fb_group_moderators m
    ON  m.user_id = v.adding_user_id
    AND m.fb_group_id = v.fb_group_id

问号代表查询参数(请求插入的用户),然后adding_user_id在查询中为其设置别名。


推荐阅读