[SQL] 조회수 증가 쿼리를 한번에 (insert or update) 가능한가요?

ohdol의 이미지

지금은 select 해보고 있으면 update 없으면 insert 하는 방식으로 동작하고 있습니다.
이걸 한 쿼리에 끝내는 방법이 있을까요?

# 테이블
create table counter (
seq int primary key,
count int default 0
);

# 현재 작동
SQL : select seq from counter where seq = 2;

CODE : if( seq )
SQL : update counter set count=count+1 where seq = 2
CODE : else
SQL : insert into counter values (2, 1)

aero의 이미지

MySQL을 쓰신다면
중복키가 있으면 업데이트하고 아니면 인서트 하는 명령인
INSERT... ON DUPLICATE KEY UPDATE .. 를 써서

아래의 쿼리에서 ?를 seq 값으로 대치시키고 실행시키면 됩니다.

insert into counter(seq,count) values(?,1)
on duplicate key update
count = count+1

세이군의 이미지

적어주신 SQL구문이 어느 버전부터 지원이 되는 지에 대해서 같이 적어주셔야 할 것 같네요.
예를 들어 이 구문이 4.1.X에서 지원이 되는데 3.23에서 실행을 시키면 안되니까요.

한 걸음 더 가까이

peccavi의 이미지

만약 업데이트 조건이 들어간다면 어떻게 해야하나요?
있으면 update, 없으면 insert가 아니라
없으면 insert,
있거나, 있더라도 크다면 update 이런식으로.. -_ -;
mysql 4.1이상입니다.

----
jai guru deva om...

----
jai guru deva om...

aero의 이미지

insert into counter(seq,count) values(5,1)
on duplicate key update count=if(count<5,count+1,5)

위 쿼리는 seq 값이 5인것이 없으면 새로 insert 하고
있지만 count값이 5보다 작으면 1증가한 값으로 update하고 아니면 5로 업데이트하는 예입니다.

peccavi의 이미지

새로운걸 배워가네요. 감사합니다~

----
jai guru deva om...

----
jai guru deva om...

ohdol의 이미지

sqlite 3.3.10 입니다.

sqlite 에서는 안되더라도 oracle이나 mysql에서의 query도 알고 싶습니다.
저런 경우가 종종 있어서 궁금했었거든요...

^^ always smile

^^ always smile

aero의 이미지

이런식으로 하면 되겠네요.

아래 쿼리에서 ?를 해당 seq 값으로 교체해서 쿼리를 날리면 됩니다.

insert or replace into counter (seq,count) values(?,ifnull( (select count from counter where seq=?)+1, 1) );

aero의 이미지

MS SQL (T-SQL) 이라면

? 값을 해당 seq값으로 바꾸고 쿼리를 날리면 됩니다.

if exist( select count from counter where seq=?)
 update counter set count=count+1
else
 insert into counter (seq,count) values(?,1)
aero의 이미지

Oracle 9i버젼 이상이라면 이렇게 하면 되지 않을까 싶네요
(테스트는 해보지 않았습니다.)

?를 해당 seq 값으로 교체후 쿼리 실행

MERGE INTO counter C
  USING (SELECT ? seq from dual) S
  ON (C.seq = S.seq)
  WHEN MATCHED THEN UPDATE SET C.count=C.count+1
  WHEN NOT MATCHED THEN INSERT (C.seq,C.count) VALUES (?,1);

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.