是否可以在SQL中返回多行插入的ID?

2024-06-09 18:58:55 发布

您现在位置:Python中文网/ 问答频道 /正文

通过下面的语句,我可以在一个表中插入多行。如果标签已经存在,那么什么也不会发生,如果它不存在,则创建行。你知道吗

INSERT INTO tags (name) VALUES ('this'),('is'),('my'),('interest'),('list'),('running'),('pokemongo'),('fighting'),('eating') ON CONFLICT DO NOTHING;

是否可以返回所有这些值的ID,无论它们是否存在?你知道吗

我在postgres9.5中使用python psycopg2。你知道吗


Tags: nameismytags标签语句thisrunning
2条回答
INSERT INTO 
    tags (name) 
VALUES 
    ('this'),('is'),('my'),('interest'),('list'),('running'),('pokemongo'),('fighting'),('eating') 
ON CONFLICT DO NOTHING 
RETURNING ID; # <== this is what you need.

编辑: 好的,使用这个解决方案,您将只获得插入行的id。你知道吗

如果需要所有ID,则必须进行另一个查询:

select ID from tags where name in ('this', 'is', 'my', 'interestest', 'list', '...')

这可以通过使用WITH块在一个查询中完成(参见WITHSELECT上的PostgreSQL文档)。例如:

WITH t1 (c1) AS ( VALUES ('this'),('is'),... ),
t2 AS (SELECT id FROM tags WHERE name IN (SELECT c1 FROM t1) ),
t3 AS (INSERT INTO tags (name) SELECT c1 FROM t1 ON CONFLICT DO NOTHING RETURNING id)
SELECT id from t2
UNION
SELECT id from t3;

也可以用WHERE c1 NOT IN (SELECT name FROM tags)替换ON CONFLICT DO NOTHING。这将在不依赖由唯一索引引起的冲突的情况下工作。你知道吗

相关问题 更多 >