table test 의 column이


name, score가 있다고 할 때


John / 50

Matthew / 40

Cain / 70


일 때 


select @rownum:=@rownum+1 as num, t.* from test t, (SELECT @rownum:=0) r 


로 하면 


num/name/score


1 / John / 50

2 / Matthew / 40

3 / Cain / 70


로 되고


select @rownum:=@rownum+1 as num, t.* from test t, (SELECT @rownum:=0) r  ORDER BY score DESC


로 하면


1 / Cain / 70

2 / John / 50

3 / Metthew / 40


로 나온다

Posted by TY
,

 일요일 새벽에 갑자기 원격 포트가 접속이 안된다고 IDC에서 문자가 왔었습니다. 이게 무슨 일일까요...


그래서홈페이지를 들어가보니 뭐 접속이 되는데, DB데이터를 불러오는 곳에서 오류메세지가 나더라구요. 


뭐 내용은 아래와 같았습니다.


Error Code: 145. Table 'scheme.table_name' is marked as crashed and should be repaired



음.. 에러를 보아하니 꼭 테이블이 깨진 것 같단 생각이 들었습니다. 일단 테이블은 MyISAM이었습니다. 갑자기 3년 전에 InnoDB로 된 거대 테이블 하나가 깨졌을 때의 안 좋은 기억이 스믈스믈 떠오르면서 그 때에 MyISAM은 복구가 굉장히 간편하다라는 검색 내용이 생각나서 좀 검색을 해봤습니다.


http://dev.mysql.com/doc/refman/5.0/en/myisam-repair.html


다음과 같은 답변이 있더군요. 뭐 간략히 요약하자면..


콘솔창이나 workbench나 phpMyAdmin 등 SQL을 실행할 수 있는 무언가를 능력껏 구동하여,


repair table 'scheme.table_name' 을 실행하면 자동적으로 고쳐진다고 합니다. 만약 그게 안된다면 위의 링크를 참조하여 고치면 되는 것 같네요.


원격 접속 안되지, phpmyadmin 안되지, 결국은 IDC에 전화해서 원격 콘솔 열어달라고해서 했습니다 -_-


보통 이 문제는 서버가 강제적으로 종료되었을 때 나타나는데, 어제 저희 홈페이지 서버가 강제로 전원이 나갔었어서 그 문자메세지가 최초로 도착한 것 같습니다.


공격이라도 받았을까봐, 원격 콘솔 열어서 RDC 포트 바꾸고 이리저리 수선을 떨었었는데..


뭐 결론은 파워서플라이 불량이었습니다. 이것부터 어제밤에 문제 생기고 계속적으로 문제가 생겨서 문자오고 메일오고 핸드폰 그래서 하루종일 징징거리고, 어제밤부터오늘 아침부터 저녁까지 수선떤걸 생각하면, 아오... 


근데 뭐 기계가 망가진게 사람의 뜻이겠습니까. 


뭐 그렇습니다. :) 


Posted by TY
,

우선 DISTINCT에 대해서 설명을 하자면 중복된 결과를 제거하고 하나만 원하고자할 때 쓰이는 문법이다.


예를 들어서  DB에


a, a, a, b, b, c 


과 같이 존재할 경우에는


a,b,c만 나오게 된다. -.,- 흔히 COUNT와 엮어서 특정 사용자가 어떤 행동을 했는지 뽑아달라고 할 때 많이 썼던 것 같다.


최근에 약 50만건의 DB에서 중복되지 않게 email들을 뽑아달라는 요청이 왔었다. 


그래서 아무 생각없이. 'DISTINCT를 쓰면 되겠구나'라고 생각을 했는데, 음... 결론적으로 말하자면 결과가 별로 좋진 않았다.


테이블을 간략화하자면 다음과 같다.


idx / int / NOT NULL, PK, AUTO_INCREMENT, INDEX

email / varchar(100) / NOT NULL

name / varchar(30) / NOT NULL


동일한 사용자는 여러개의 name(많은 사람은 400개 정도 --;)를 가질 수 있고, 이것을 DISTINCT로 거르자는게 내 생각이었다.


그래서 아무 생각없이


SELECT DISTINCT email FROM table;


로 끝내려고 했는데, 음 캐릭터 이름도 나와야할 것 같아서 캐릭터 이름을 그냥 나중에 뒤로 추가했다.


SELECT DISTINCT email, name FROM table;


그랬더니 왠지 모르게 결과가 많이 늘었지만 (그 당시에는 인지하지 못했다) 무시하고 지나갔는데 오늘 생각해보니 이런 이유였던 것 같다.


 SELECT DISTINCT email, name FROM table 에서


DISTINCT는 (email, name) 짝을 하나의 결과물로 묶고 저 두개가 같은 결과들만 쳐낸 것이 아닐까 --; 그럼에도 불구하고 결과가 약 17만건이 줄었던 것이 여전히 충격적이다.


그래서 다음과 같은 경우에는 이제 아래와 같은 방법을 사용하면 될 것 같다...;;


SELECT email, name FROM table WHERE idx in (SELECT DISTINCT email FROM table) ORDER BY idx DESC


만약 저렇게 한다면 최신 캐릭터명으로 이메일들이 1개씩만 나오지 않을까 생각한다 -_-;


mysql만 쓴지 벌써 5년짼데 아직도 이딴 삽질을 하는거 보면 맨날 헛공부를 하는 것 같다.



Posted by TY
,

MySQL을 쓰다가 아무 생각없이 칼럼이름을 order로 지었다.

뭐 잘 되겠지 싶었느네

INSERT INTO table_name(order, ... ,) VALUES(0, ... , )
이렇게 넣으니 order행에서 에러가 나는 것이어다

그래서 나는 이 부분을

INSERT INTO 'shcema_name'.'table_name'('order', ... ) VALUES(0, ... ,)

같은 식을 처리했는데 같은 에러가 계속 나는 것이다

그래서 MySQL Workbench tool을 이용해서 같은 데이터를 Edit Tableㅇ르 이용해서 값을 삽입해봤다.

그랬더니 INSERT INTO `schema_name`.`table_name`(`order, ...)

이런식으로 작성되는 것이다.

위의 것은 홀따옴표(엔터 옆의 그것) 이고 아래 것은 1 옆에 있는 그것이다.

그런데 저렇게 수정하니 잘 되는 것이 아닌가 -_-...

결론은..

스키마 이름이나 칼럼 네임은 `으로 묶어야 하고 뒤의 데이터는 '으로 묶어야 한다는 이야기..

오늘의 삽질 하나 끝~
Posted by TY
,

아.. 속상하다 진짜.ㅠㅠ 게을러서 망함 ㅠㅠ

코드 테이블에 관련된 부분을 보고 있는데 자꾸 iBatis에서 본 적도 없는 에러가 나는 것이었다.

 에러 내용인즉슨..

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];   

--- The error occurred in sqlmap/dummy.xml.  

--- The error occurred while applying a result map.  

--- Check the code.CodeResult.  

--- The error happened while setting a property on the result object.  

--- Cause: net.sf.cglib.beans.BulkBeanException; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:   

--- The error occurred in sqlmap/dummy.xml.  

--- The error occurred while applying a result map.  

--- Check the code.CodeResult.  

--- The error happened while setting a property on the result object.  

--- Cause: net.sf.cglib.beans.BulkBeanException



였다.

인터넷에는

1. 아마 ResultMap에 property랑 매치가 안될 것이다
2. 네가 ResultMap 지정해 준 클래스에 getter, setter가 제대로 지정이 안 되있을 것이다
3. ResultMap에 쓸 class랑 ResultMap의 property수가 맞지 않을 것이다

였는데 다 안되는거였다.

찾아오는 멘붕.. 

알고보니까 INT형 값에 기본값이 들어있지 않으면 에러가 나는거였다. 

다른걸 하고 있다가 번뜩이며 생각나서 그냥 막 값을 넣어보았더니 갑자기 하나는 받아오는데 성공하고 다음꺼부터 실패하더라 ㅠㅠ

이제 웹/웹서버 개발 나름 만 3년 정도 채운 것 같은데..

스프링은 배운지 아직도 채 1년이 되지 않았기 때문에 삽질이 너무 많아서 작업 속도가 영 안나오는 것 같다.

대형 프레임웍을 수용할 수 있으려면 게임 서버를 만들건 뭘 만들건 스프링같은 프레임웍을 쓰는게 좋을 것 같은데...

php처럼 막 짤 수가 없는 부분이 답답하다. 그렇다고 Servlet을 쓰자니 php하는 만 못하는 것 같고... 언제쯤 능숙해질까? 걱정이다. 

spring에러는 ASP보다 해석하기가 더 어려운 것 같다 -_- ASP구버전도 에러 해석할 때 정말 힘들었는데..

어쨌든 오늘은 글자 하나 써주긱 귀찮아서 삽질을 좀 오래 했다.

오늘의 교훈: column에 default value 설정을 꼼꼼히 해주자 

 

Posted by TY
,