mysql에서 delete, update시 유의사항

다년간의 경험으로 터득한게 있다면,
delete나 update시 일단 select 를 먼저 해보는 것이다. 꼭 where를 붙이는건 당연하다.

왜? delete, update하고 나서 등에 식은땀이 흐르거나, 똥꼬(?)가 바짝 쪼이거나, 입이 바싹 마르는 경험을 한 사람이라면 공감하지 않을까 싶다.

create table zipcode
(
code  varchar(10),
address1 varchar(255),
primary key (code)
);
이런 테이블을 일단 만들어 보자.
데이터도 살짝 넣어볼까?
insert into zipcode values('000100','aaaaa');
insert into zipcode values('000101','bbbbb');
insert into zipcode values('000102','ccccc');

insert into zipcode values('a00100','aaaaa');
insert into zipcode values('a00101','bbbbb');
insert into zipcode values('a00102','ccccc');
자! 평소 같으면 절대 실수 하지 않는 사람도 가끔은 아래와 같은 실수를 한다.
update zipcode
set address1='ddddd';
지금이야 데이터가 6건 밖에 없지만 수백만건이라고 하면... 덜덜덜;;


근데 이 정도는 애교다.





delete from zipcode
where code=0;

자! 위 결과가 어떻게 되리라고 생각하는가?
아무것도 삭제되지 않겠군...이라고 생각했었다.


결과는 두둥

(3 row(s)affected)
(0 ms taken)

앗! 뭐지뭐지?
일단, 원복해 놓고, select를 해볼까?

select * from zipcode
where code=0;

결과는 아래와 같다.

code    address1
------  --------
a00100  aaaaa  
a00101  bbbbb  
a00102  ccccc  
이제, 말하고 싶은게 나왔다. int형으로 cast시에 문자가 포함되어 있으면 0이되는 것이다.
select cast('a00100' as unsigned);

아래가 바로 그 결과다.
cast('a00100' as unsigned)
--------------------------
                         0


아무튼 특별한 경우에는 생기지 않겠지만, 프로그래밍 언어와 적절히 조화되어 이러한 사태가 발생한다면 대략 낭패다.

내 옆에서 위와 같은 사태가 일어나는 것을 목격했었다. 그때는 심각하게 생각하지도 않았고, 설마 '니가 잘못했겠지라' 생각했다.

근데 오늘 살짝 위와 같은 문제가 발생했다. 다행히 초반에 잡아서 데이터 건수는 고작 6건. 손으로 살짝 고쳐주는 센스를 발휘했다.

다시 한번 잊지말자. delete, update시에는 select를 먼저해보자!

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by 스팟 | 2007/08/08 01:18 | 개발 | 트랙백 | 덧글(2)

트랙백 주소 : http://iklo.egloos.com/tb/3670992
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 샘이 at 2007/08/08 09:31
MySQL에도 Rollback을...
Commented by 스팟 at 2007/08/08 11:07
engine type을 MyISAM으로 안하고 InnoDB로 하면 되겠지만...
코딩 오류로 저렇게 되버리면 롤백도 못한다는 ㅜㅜ

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶