PostgreSQL:INSERT如果不存在,则返回ID
如果没有IP地址,下面的查询将插入IP地址并返回IDPostgreSQL:INSERT如果不存在,则返回ID,sql,postgresql,Sql,Postgresql,如果没有IP地址,下面的查询将插入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 gl
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。我不确定它是否最优雅;但它每次都返回IP的ID。
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
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;
但是,比原来的要慢一点
这需要我放置两次IP,我已经用设置了一次IP值。您尝试了吗?因为在我看来没问题。你能提供样本数据吗?是的,我提供了。它要求我将IP“1.1.1.2”放置两次。只有一个ID序列列和一个INET列。