有人可以解释SQL中使用的IF存在命令吗?
例如:
if exist(select * from waiter){
update waiter set (...) where waiter_id='somevalue'
} else{
insert into waiter values (values)
}
您还可以解释如何在不进入数据库的情况下检查更新/插入?
我不知道这是否有帮助,但是代码应该读取:
if exist(select * from waiter where waiter_id='somevalue') {
update waiter set (...) where waiter_id='somevalue'
} else{
insert into waiter values (values)
}
在这种情况下,if exists . . .
部分说"如果存在记录在表中"。总体而言,该声明说:"如果'somevalue'
记录在该值中存在,然后更新记录;否则,插入新记录。"
您采用的方法是错误的。不起作用。停止。
去阅读有关UPSERTS的指南:
- 插入,在PostgreSQL中的重复更新? 中
- 如何在PostgreSQL? 中抬高(合并,插入...在重复更新上)
,然后使用在此处记录的正确的方法之一,要么锁定表并进行UPSERT或在重试循环中进行。
了解为什么您当前的方法是错误的,请考虑两个人同时执行同一命令时会发生什么。
- Person1:
select * from waiter
- Person2:
select * from waiter
- person1:
if exist(...)
=> false,不,不存在 - person2:
if exist(...)
=> false,不,不存在 - Person1:
insert...
- Person2:
insert...
和 boom,您有两个记录。
(这种方法也非常低效 - SELECT * FROM WAITER
太可怕了)。
这就是为什么每个人都向您链接到文章和文档的链接,向您展示如何正确执行。您正在尝试解决错误的问题。您实际上是在说:"当我开车到交叉路口而不看交通信号灯时,我怎么知道其他人已经在那里?"。我们说:"嗯,不要那样。看交通信号灯。"
只有一旦您拥有实际的UPSERT("创建如果不存在")操作正确,则担心如何从node.js进行处理。
无论如何,我会说它会像其他任何查询一样:运行查询/命令,根据查询结果获得ID(现有或新创建),请根据需要使用ID。如果您需要在该部分方面提供更多帮助,请尝试在该部分上发布一个node.js特定问题,而没有所有不正确的上述代码混乱以使所有人脱离轨道。考虑到postgresql标签上的许多人对node.js都不了解。
exists
语句在SQL上进行部分扫描以了解是否返回。
如果我们检查了有关 exists
的性能,如果与count()进行了比较。我们会看到存在一个非常快的sql,因为计数将在数据库中检查每行。
希望它有帮助。