Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL:INSERT如果不存在,则返回ID_Sql_Postgresql - Fatal编程技术网

PostgreSQL:INSERT如果不存在,则返回ID

PostgreSQL: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

如果没有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 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列。