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 포인트
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
식으로도 할 수 있습니다
답변에 대한 댓글 4개
qoqofh
3년 전
3년 전
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으로 해야 하네요.
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으로 해야 하네요.
qoqofh
3년 전
중복인 경우, update해야하는 경우에는 어떻게 해야할까요? 궁극적인 문제가 기존 있는 데이터는 UPDATE하는 경우여서요 ㅠ
3년 전
WHERE NUM > (SELECT coalesce(max(NUM), 0) FROM table1)
이 조건은 중복?이 생길 수 없습니다.
있다고 한다고 하면
ON DUPLICATE KEY UPDATE
사용하시면 됩니다.
이 조건은 중복?이 생길 수 없습니다.
있다고 한다고 하면
ON DUPLICATE KEY UPDATE
사용하시면 됩니다.
3년 전
num 과 같은 것들과 아닌것들을 두 분류로 나눠서 업데이트를 하면 되지 않을가요?
쿼리문을 2개로 해서요. 일단 쉬운쪽으로 하시고 나중에 업데이트 하시는 방향이 바람직해 보이네요.
잠간 생각해 봤지만 if else 문도 사용가능할 것으로 보이네요
아래 소스는 위 사이트 내용입니다.
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개
3년 전
on duplicate key update를 사용하세요.
답변에 대한 댓글 2개
qoqofh
3년 전
현재 인서트는 해당모든 데이터를 가져오는데, num이 같을 시에는 update로 진행해야하는데,
키업 진행시, 어디에 위치시켜야할지가 어렵네요..ㅠ
키업 진행시, 어디에 위치시켜야할지가 어렵네요..ㅠ
qoqofh
3년 전
해당 쿼리 사용 시,
[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로 바꾸는 예제사항)
[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로 바꾸는 예제사항)
답변을 작성하려면 로그인이 필요합니다.
[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]
이형태가 맞는지요 ㅠㅠ?