2016-08-25 4 views
0

아래의 설명을 통해 표에 여러 행을 삽입 할 수 있습니다. 태그가 이미 존재하면 아무 일도 일어나지 않으며 존재하지 않으면 행을 만듭니다.SQL에 다중 행 삽입의 ID를 반환 할 수 있습니까?

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

이러한 값의 존재 여부와 상관없이 모든 값의 ID를 반환 할 수 있습니까?

저는 postgres 9.5와 함께 python psycopg2를 사용하고 있습니다.

답변

2

(WITHSELECT에 PostgreSQL의 문서를 참조) : 당신은 모든 ID를해야하는 경우

, 당신은 다른 질문을해야합니다. 예를 들어 :

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을 대체 할 수 있습니다. 고유 인덱스로 인한 충돌에 의존하지 않고도 작동합니다.

+0

"INSERT"또는 근처에서 구문 오류가 발생합니다. "WITH"로 더 읽을거야 – DigitalDisaster

+0

미안하지만, 나쁘지. UNION이 SELECT 문에만 참여할 수 있다는 사실을 잊어 버렸습니다. 편집 된 답변을 참조하십시오. 이 쿼리는 좀 더 단순하게 단순화 될 수 있습니다. – ASL

+0

이것은 환상적인 대답입니다. 다른 어떤 것들에 대해서 조금 더 이해할 수있게 도와주었습니다. 대단히 감사합니다. – DigitalDisaster

0
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를 얻을 수 있습니다.

이 블록과를 사용하여 하나 개의 쿼리에서 수행 할 수 있습니다
select ID from tags where name in ('this', 'is', 'my', 'interestest', 'list', '...') 
+0

시도해 보았습니다. 행이 삽입되면 ID 만 반환하지만 행이 이미있는 경우 아무 것도 반환하지 않습니다. – DigitalDisaster

+0

그래, 그 두 번째 쿼리를 피할 수 있었으면 좋겠다. 촬영을 가져 주셔서 감사합니다. – DigitalDisaster