테스트 사이트 - 개발 중인 베타 버전입니다

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

qoqofh 2년 전 조회 2,201

</p>

<p>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</p>

<p>

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

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

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

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

답변 3개

채택된 답변
+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개

q
qoqofh
2년 전
말씀주신 내용이

[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]

이형태가 맞는지요 ㅠㅠ?
엑스엠엘
2년 전
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으로 해야 하네요.
q
qoqofh
2년 전
중복인 경우, update해야하는 경우에는 어떻게 해야할까요? 궁극적인 문제가 기존 있는 데이터는 UPDATE하는 경우여서요 ㅠ
엑스엠엘
2년 전
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

 

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

 

</p>

<pre>
<code>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]')
)
</code>

 

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

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

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

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

그누위즈

on duplicate key update를 사용하세요.

https://wickedmagica.tistory.com/253

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

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

[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로 바꾸는 예제사항)

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

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

로그인