通过下面的语句,我可以在表格中插入多行。如果标签已存在则没有任何反应,如果它不存在,则会创建该行。
INSERT INTO tags (name) VALUES ('this'),('is'),('my'),('interest'),('list'),('running'),('pokemongo'),('fighting'),('eating') ON CONFLICT DO NOTHING;
是否可以返回所有这些值的ID,无论它们是否存在?
我使用python psycopg2和postgres 9.5。
答案 0 :(得分:2)
这可以使用WITH块在一个查询中完成(请参阅WITH和SELECT上的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;
您也可以将ON CONFLICT DO NOTHING
替换为WHERE c1 NOT IN (SELECT name FROM tags)
。这可以在不依赖于由唯一索引引起的冲突的情况下起作用。
答案 1 :(得分:0)
select ID from tags where name in ('this', 'is', 'my', 'interestest', 'list', '...')
修改强> 是的,使用此解决方案,您只能获得插入行的ID。
如果您需要所有ID,则必须进行另一个查询:
ar.AccessToken