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

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

QA

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

답변 3

본문


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

제목대로라면

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

식으로도 할 수 있습니다

 

 

 

 

 

 

말씀주신 내용이


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


이형태가 맞는지요 ㅠㅠ?

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으로 해야 하네요.

on duplicate key update를 사용하세요.

https://wickedmagica.tistory.com/253

해당 쿼리 사용 시,



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'


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

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

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

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

 

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

 

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

 

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

 



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]')
)

 

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

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

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 123,726
© SIRSOFT
현재 페이지 제일 처음으로