채택완료

SQL 쿼리에서 INSERT와 UPDATE를 값이 없는경우 인서트 있는경우 업데이트

Copy
INSERT INTO table1
        (
            NUM, TEMP21, TEMP22, TEMP23, TEMP24, TEMP25, TEMP26, TEMP27, TEMP28, TEMP29, TEMP30, CDT
        )
        SELECT
            T1.*
            , now() AS CDT
        FROM
            table2 T1
        WHERE 1=1
            AND NUM > (SELECT coalesce(max(NUM), 0) FROM table1)
        ORDER BY
            NUM ASC

위 쿼리문에서 table2에 있는 데이터를 table1에 인서트 하는 쿼리문인데,

만약 값이 없으면 인서트하고, 값이 있다면 업데이트 하는 쿼리로 바꿀려면 어떻게 진행하여야 할까요?

데이터 유무는 NUM컬럼을 기준으로 체킹하고 싶네요ㅠ

답변 3개 / 댓글 7개

채택된 답변
+20 포인트

제목대로라면

insert ... on duplicate key update가 맞지만

 

WHERE NUM > (SELECT coalesce(max(NUM), 0) FROM table1)

//  ORDER BY NUM ASC

Max보다 크다는 것은

T2에만 있는 것을 넣겠다는 것 같군요

 

Insert into T1( ...)

select T2... from  T1 inner join T2 on T1.num=T2.num

where T2.num is null

식으로도 할 수 있습니다

 

 

 

 

 

 

답변에 대한 댓글 4개

말씀주신 내용이

[code]
INSERT INTO user_tbl_test
(
`no`, userid, name, passwd, sex, email, `date`, ip_addr
)
SELECT
T1.*
FROM
user_tbl T1 INNER JOIN user_tbl_test ON user_tbl_test.`no` = T1.`no`
WHERE 1=1
AND T1.`no` > (SELECT coalesce(max(`no`), 0) FROM user_tbl_test) AND T1.`no` IS NULL
[/code]

이형태가 맞는지요 ㅠㅠ?
INSERT INTO user_tbl_test ( `no`, userid, name, passwd, sex, email, `date`, ip_addr ) 
        SELECT  T1.no, T1.userid, T1.name, T1.passwd, T1.sex, T1.email, T1.date, T1.ip_addr
        FROM  user_tbl T1 left JOIN user_tbl_test ON user_tbl_test.`no` = T1.`no` 
        WHERE  user_tbl_test.no IS NULL

left join으로 해야 하네요.
중복인 경우, update해야하는 경우에는 어떻게 해야할까요? 궁극적인 문제가 기존 있는 데이터는 UPDATE하는 경우여서요 ㅠ
WHERE NUM > (SELECT coalesce(max(NUM), 0) FROM table1)
이 조건은 중복?이 생길 수 없습니다.
있다고 한다고 하면
ON DUPLICATE KEY UPDATE
사용하시면 됩니다.

num 과 같은 것들과 아닌것들을 두 분류로 나눠서 업데이트를 하면 되지 않을가요?

쿼리문을 2개로 해서요. 일단 쉬운쪽으로 하시고 나중에 업데이트 하시는 방향이 바람직해 보이네요.

 

잠간 생각해 봤지만 if else 문도 사용가능할 것으로 보이네요

 

https://stackoverflow.com/questions/33215734/mysql-insert-or-update-if-exists-but-not-based-on-key-column

 

아래 소스는 위 사이트 내용입니다.

 

Copy
IF EXISTS(SELECT id FROM Table WHERE username = '$data[1]' AND course <> '$data[3]')
(
UPDATE username='$data[1]',type='$data[2]',course='$data[3]',status='$data[4]',started='$data[5]',completed='$data[6]'
)
(
INSERT into table(recordnumber, username,type,course,status,started,completed) values('$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]','$data[6]')
)

 

이 부분이 도움이 되실것 같습니다.

이 부분이 아니시라면 검색을 더 해보시면 될것 같구요.

답변에 대한 댓글 1개

아 if else도 방법이긴하겠는데, 실상 모든 데이터들을 배열로 저장하기엔 리스크가 너무 클듯 해서요 ㅠ

on duplicate key update를 사용하세요.

https://wickedmagica.tistory.com/253

답변에 대한 댓글 2개

현재 인서트는 해당모든 데이터를 가져오는데, num이 같을 시에는 update로 진행해야하는데,
키업 진행시, 어디에 위치시켜야할지가 어렵네요..ㅠ
해당 쿼리 사용 시,

[code]

INSERT INTO user_tbl_test
(
`no`, userid, name, passwd, sex, email, `date`, ip_addr
)
SELECT
T1.*
FROM
user_tbl T1
WHERE 1=1
AND T1.`no` > (SELECT coalesce(max(`no`), 0) FROM user_tbl_test)

ON DUPLICATE KEY UPDATE user_tbl INNER JOIN user_tbl_test
ON user_tbl.`no` = user_tbl_test.`no`
SET user_tbl_test.sex = 'w'
WHERE user_tbl.sex = 'w'
[/code]

이렇게 짜보았는데, INSERT는 잘되는데, no가 중복일 경우에는 업데이트 하라라는 건데,

업데이트 되지 않는데, 쿼리 문법이 잘못 된걸까요? (user_tbl의 컬럼sex가 w인 경우, user_tbl_test의 컬럼 sex의 데이터를 w로 바꾸는 예제사항)

답변을 작성하려면 로그인이 필요합니다.