[英]PostgreSQL: INSERT if it doesn't exist, RETURN the ID if it does
以下查詢插入 IP 地址(如果沒有)並返回 ID。
WITH variables AS (
SELECT '1.1.1.2'::inet AS ip
)
INSERT INTO globals.ips (ip)
SELECT v.ip
FROM variables AS v
WHERE NOT EXISTS (
SELECT i.global_ip_id
FROM globals.ips AS i
WHERE i.ip = v.ip
)
RETURNING global_ip_id
但是,當該值已存在於數據庫中時,它不會返回 ID。
當值已經存在時,如何獲取 ID?
我正在運行 PostgreSQL 12。
WITH variables AS (
SELECT '1.1.1.2'::inet AS ip
), wt0 as (
INSERT INTO globals.ips (ip)
SELECT v.ip
FROM variables AS v
WHERE NOT EXISTS (
SELECT i.global_ip_id
FROM globals.ips AS i
WHERE i.ip = v.ip
)
RETURNING global_ip_id
)
SELECT global_ip_id FROM wt0
UNION
SELECT id FROM globals.ips WHERE ip = 'SOMETHING';
我不確定這是最優雅的; 但它每次都會返回 IP 的 ID。 而我只需要輸入一次IP。
WITH v AS (
SELECT '1.1.1.110'::inet AS ip
), i AS (
INSERT INTO globals.ips (ip)
SELECT * FROM v
WHERE NOT EXISTS (
SELECT i.global_ip_id
FROM globals.ips AS i
WHERE i.ip = v.ip
)
RETURNING global_ip_id
)
SELECT global_ip_id FROM i
UNION ALL
SELECT global_ip_id FROM globals.ips g
LEFT JOIN v ON g.ip = v.ip
WHERE g.ip = v.ip
LIMIT 1;
如果有人對如何改進這一點有任何建議,請告訴我。
更優雅的解決方案:
INSERT INTO globals.ips (ip) VALUES ('1.1.1.1'::inet)
ON CONFLICT (ip) DO UPDATE SET ip = EXCLUDED.ip
RETURNING global_ip_id AS id;
但是,比原來的慢一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.