2016-09-05 2 views
0

이 질문은 매우 간단하지만 "UPDATE JOIN INSERT"와 같은 다른 것들을 검색하여 아직 답을 찾지 못했습니다.UPDATE JOIN -> INSERT ON NULL

두 개의 테이블 ('main'및 'sub')에 대해 UPDATE가 필요하지만 하나의 데이터 세트가 존재하지 않을 수 있습니다. 이전에 실행 된 간단한 INSERT가 있어야합니다 ... 하나의 명령문에서.

'main'항상 존재합니다.
'하위'는 없습니다.

내 꿈-SQL-솔루션이 하나입니다

UPDATE main LEFT JOIN sub on main.primary=sub.primary 
SET main.foo='bar', sub.foo2='bar2' 
CASE sub.primary IS NULL {INSERT INTO sub SET sub.primary=main.primary}; 

'CASE' 부분은 자유형이며, 아마도 작동하지 않습니다. 하지만 올바른 방법은 무엇입니까?

반드시 "업데이트 [...] LEFT JOIN [...] SET a = aVal, b = bVal, [...]"- 명령문. LEFT JOIN 테이블을 최대 5 개까지 확장 할 수 있고 "SET (..) VALUES (..)"없이도 작업 할 수 있습니다.

가능한 해결책이 있습니까?

+0

는 논리를 반전하고, 그것을 위해 구글 대신에 – Strawberry

+3

INSERT INTO 테이블 ... 중복 키 업데이트 ... – Mike

+0

이유는 '절대적으로 업데이트되어야합니다 [...] LEFT JOIN [...] SET a = aVal, b = bVal, [...] "- 성명서." – Pachonk

답변

1

UPDATE 문은 존재하는 행을 수정할 수 있습니다. 에서 새 행을 추가 할 수 없습니다. 전혀.

INSERT 문을 사용하여 테이블에 행을 추가 할 수 있습니다. "누락 된"행을 추가하는 문장을 작성할 수 있습니다.

그러나 "행을 추가하려면 반드시 UPDATE"문을 사용해야한다면 아무런 해결책이 없습니다.

+0

하나의 Statement에서 INSERT 및 UPDATE 문이 실행되었다고 생각했습니다. 명령문에서 Subselects를 사용할 수 있습니다. 그것은 아직 하나의 성명이 아닌가? – Charliexyx

+0

UPDATE에서 트리거의 컨텍스트에서 INSERT 문을 실행할 수 있습니다. 예를 들어 행이 업데이트 될 때마다 감사 테이블에 행을 추가하는 트리거를 정의 할 수 있습니다. (UPDATE 문의 실행으로 인해 발생하더라도 행을 삽입하는 INSERT 문입니다.)하지만 UPDATE 문에서 참조되는 동일한 테이블에 행을 삽입 할 수는 없다고 생각합니다. 나는 그것이 제한이라고 생각한다.그리고 가능한 경우에도 UPDATE 문이 아니라 INSERT 문을 사용하여 행을 추가 할 수 있습니다. – spencer7593

+0

동일한 테이블에서 작동하는 경우 훌륭한 솔루션이 좋습니다. 슬픈 트리거는 모든 것을 너무 복잡하게 만들기 때문에 허용되지 않습니다. (MySQL Logic이 없다.) 유지 보수를 쉽게하기 위해서는 로직이 표시되어야한다.) – Charliexyx

3

ON DUPLICATE KEY이 최선의 방법 일 수 있습니다. 당신이 당신의 쿼리의 일환으로 참여 왼쪽해야하는 경우

INSERT INTO sub s (col1, col2, col3) 
SELECT m.col1, m.col2, m.col3 
FROM MAIN m 
ON DUPLICATE KEY 
UPDATE SET m.foo='bar', s.foo2='bar2' 

는 단순히과 같이 선택에 추가 :의 라인 주위
뭔가

INSERT INTO sub s (col1, col2, col3) 
SELECT m.col1, m.col2, m.col3 
FROM MAIN m 
LEFT JOIN sub s ON s.primary = m.primary 
LEFT JOIN sub2 s2 ON s2.primary = m.primary 
ON DUPLICATE KEY 
UPDATE SET m.foo='bar', s.foo2='bar2', s.foobar = s2.foobar 
+0

OP는 '절대적으로 UPDATE ... LEFT JOIN ...'문이어야한다. UPDATE 문 이것은 INSERT 문의 예입니다. – spencer7593

+0

@ spencer7593 최종 답변이 업데이트가되기를 원한다고 말했지만 문제에 대한 최선의 해결책이므로이 대답을 거기에 넣을만한 가치가 있다고 생각했습니다. OP가 현재 직면 중입니다 – Pachonk

+0

LEFT JOIN이 아닌 LEFT JOINS가 하나만있는 경우이 솔루션을 계속 사용할 수 있습니까? – Charliexyx