sql - 确保只有表中的现有用户可以在 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 添加到该组中作为版主。
解决方案
您需要将请求插入的用户的 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
在查询中为其设置别名。
推荐阅读
- php - 无法使用核心 php 中的限制检索 Shopify API 响应标头链接中的 URL 以进行分页
- z3 - Z3 策略用于在带有量词的公式中消除连词
- r - 如何用 R 处理 Cox 分析中的错误
- android-studio - 我可以让 Android Studio 生成带有命名参数的 Dart 构造函数代码并添加密钥吗?
- apache-spark - 如何通过 GeoMesa/Spark 以编程方式读取 shapefile?
- python - 未填写 field1 时 request.form.get('field1') 返回什么?
- uipath - 如何在 ui 路径中获取 orchestrator-Tenant 选项?
- javascript - 为大于 400 像素的图像设置“最小宽度:100%”?JS 或 CSS
- docker - 有没有更好的方法来避免从 manjaro 中的 docker compose 启动的 docker 容器的文件夹权限问题?
- python - 在 Python 中构造一个 URI?