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

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

QA

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

본문


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

 

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

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

답변을 작성하시기 전에 로그인 해주세요.
전체 114
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT