r2dbc 验证 id 是否存在,然后插入行

问题描述

我使用 r2dbc 执行以下 sql 查询

      client.sql("INSERT INTO relation(id,rel_id) "
            + "VALUES(:id,:rel_id)")
      .filter((statement,executeFunction) -> statement.returnGeneratedValues("id").execute())
      .bind("id",id)
      .bind("rel_id",rel_id)
      .fetch()
      .first()
      .subscribe(
              data -> log.info("inserted data : {}",data),error -> log.error("error: {}",error)
      );

我的问题是 rel_id 是另一个表 Person 的约束(外键)。所以,我想检查表 Person 中是否存在 rel_id ,如果存在则插入关系。或者如果不是在 Person 表中建立,可能会抛出一些异常。我不知道这种情况的首选方式是什么。

解决方法

这是一个仅使用 SQL 且不特定于 R2DBC 的解决方案:您可以使用 INSERT .. SELECT 仅有条件地插入数据:

INSERT INTO relation (id,rel_id)
SELECT :id,rel_id
FROM other_table
WHERE rel_id = :rel_id

如果您的另一个表中没有 :rel_id 行,那么该语句将不会插入任何内容。