我想在 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')
不幸的是,在 PostGreSQL 中插入和 where 不配合。什么是適合我的查詢的語法?我正在考慮ON CONFLICT,但找不到將它與 JSON 物件一起使用的語法。(示例中的資料)
是否可以?
uj5u.com熱心網友回復:
您可以使用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 注入攻擊。查看如何在您的宿主語言中使用引數化查詢。很可能對于表名引數不能使用。您需要一些其他方法來將名稱列入白名單或正確參考它們。
uj5u.com熱心網友回復:
將 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 條件有效!另一個尚未提交的事務對于此查詢是不可見的。這可能會導致資料質量問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/360565.html
標籤:PostgreSQL的 sql 插入
上一篇:如何將資料合并為一行
