postgreSQL On Conflict 可以与 JSON 个对象结合使用吗?

Can postgreSQL OnConflict combine with JSON obejcts?

我想在 PostgreSQL 中执行条件插入。类似于:

INSERT INTO {TABLE_NAME} (user_id, data) values ('{user_id}', '{data}') 
WHERE not exists(select 1 from files where user_id='{user_id}' and data->'userType'='Type1')

遗憾的是,insert 和 where 在 PostGreSQL 中不配合。什么语法适合我的查询?我正在考虑 ON CONFLICT,但找不到将它与 JSON 对象一起使用的语法。 (示例中的数据)

可能吗?

您可以使用 INSERT ... SELECT ... WHERE ....

INSERT INTO elbat
            (user_id,
             data)
            SELECT 'abc',
                   'xyz' 
            WHERE NOT EXISTS (SELECT *
                                     FROM files
                                     WHERE user_id = 'abc'
                                     AND data->>'userType' = 'Type1')

看起来您正在使用宿主语言创建查询。不要使用字符串连接或插值来获取其中的值。这很容易出错,并使您的应用程序容易受到 SQL 注入攻击。查看如何以您的宿主语言使用参数化查询。很可能无法使用 table 名称参数。您需要一些其他方法来将名称列入白名单或正确引用它们。

将 VALUES 部分重写为 SELECT,然后可以使用 WHERE 条件:

INSERT INTO { TABLE_NAME } ( user_id, data ) 
SELECT
    user_id,
    data 
FROM
    ( VALUES ( '{user_id}', '{data}' ) ) sub ( user_id, data ) 
WHERE
    NOT EXISTS ( 
        SELECT 1 
        FROM files 
        WHERE user_id = '{user_id}' 
        AND data -> 'userType' = 'Type1' 
        );

但是,不能保证 WHERE 条件有效!另一个尚未提交的事务对此查询不可见。这可能会导致数据质量问题。