gpt4 book ai didi

sql - 对一个表中的值使用 if else 将数据插入另一个表

转载 作者:行者123 更新时间:2023-11-29 14:14:56 24 4
gpt4 key购买 nike

我想允许用户将数据添加到我的“posts” '表如果用户条目在我的'users ' 表有一个 banned_till nil 的值或小于当前时间。

类似(伪代码);

If (select banned_till from users where userid = $1) = nil or < currentTime
Insert in posts (col1, col2) values ('abc', 'xyz')
ELSE
RAISE Exception "User is banned"
ENDIF

目前我正在使用 2 个查询来执行此操作;第一个检查用户是否被禁止,然后第二个插入到帖子表中。如果可以的话,我真的很想将它们组合成一个查询。

注意:我真的不喜欢使用存储过程或对 SQL DB 过于特殊的东西。更喜欢简单和通用的东西。


编辑:我选择了欧文答案的修改版本。

DO
$$
BEGIN
IF (select banned_till from users where unqid = 'user01') < now() THEN
RAISE EXCEPTION 'User is banned';
ELSE
insert into posts (unqid, title, link, content, author_id, author_nick, author_flair)
SELECT 'pid03', 'Sample post title', 'www.google.com', 'This is a sample Post Content', unqid, nickname, flair
from users where unqid = 'user01';
END IF;
END
$$;

优点:现在我的禁令检查发生在其他查询被触发之前。没有比赛条件。最重要的是,我现在可以有两条不同的错误消息——一条是关于禁止检查的,另一条是关于 unqid 不匹配的。缺点:我对用户重做了两次选择查询

最佳答案

不要运行单独的 SELECT,这只会增加成本 - 并在并发写入负载下引入无端竞争条件:用户可能会在 SELECTINSERT 或类似的并发症。

更快、更简单、更安全地对抗竞争条件:

INSERT INTO posts (col1, col2) 
SELECT 'abc', 'xyz'
FROM users
WHERE userid = $1 -- assuming userid is UNIQUE
AND (banned_till >= currentTime) IS NOT TRUE;

如果需要异常,可以将其包装在函数或 SQL DO 语句中:

DO
$$
BEGIN
INSERT INTO posts (col1, col2)
SELECT 'abc', 'xyz'
FROM users
WHERE userid = $1
AND (banned_till >= currentTime) IS NOT TRUE;

IF NOT FOUND THEN
RAISE EXCEPTION 'User is banned';
END IF;
END
$$;

关于IF NOT FOUND:

根据您的具体要求,竞争条件可能无关紧要(就像您的情况一样)或具有破坏​​性。相关:

关于sql - 对一个表中的值使用 if else 将数据插入另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52390266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com