2007년 08월 08일
mysql에서 delete, update시 유의사항
다년간의 경험으로 터득한게 있다면,
delete나 update시 일단 select 를 먼저 해보는 것이다. 꼭 where를 붙이는건 당연하다.
왜? delete, update하고 나서 등에 식은땀이 흐르거나, 똥꼬(?)가 바짝 쪼이거나, 입이 바싹 마르는 경험을 한 사람이라면 공감하지 않을까 싶다.
데이터도 살짝 넣어볼까?
근데 이 정도는 애교다.
앗! 뭐지뭐지?
일단, 원복해 놓고, select를 해볼까?
아래가 바로 그 결과다.
아무튼 특별한 경우에는 생기지 않겠지만, 프로그래밍 언어와 적절히 조화되어 이러한 사태가 발생한다면 대략 낭패다.
내 옆에서 위와 같은 사태가 일어나는 것을 목격했었다. 그때는 심각하게 생각하지도 않았고, 설마 '니가 잘못했겠지라' 생각했다.
근데 오늘 살짝 위와 같은 문제가 발생했다. 다행히 초반에 잡아서 데이터 건수는 고작 6건. 손으로 살짝 고쳐주는 센스를 발휘했다.
다시 한번 잊지말자. delete, update시에는 select를 먼저해보자!
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지금이야 데이터가 6건 밖에 없지만 수백만건이라고 하면... 덜덜덜;;
set address1='ddddd';
근데 이 정도는 애교다.
delete from zipcode
where code=0;
자! 위 결과가 어떻게 되리라고 생각하는가?
아무것도 삭제되지 않겠군...이라고 생각했었다.
결과는 두둥
(3 row(s)affected)
(0 ms taken)
앗! 뭐지뭐지?
일단, 원복해 놓고, select를 해볼까?
select * from zipcode
where code=0;
결과는 아래와 같다.
code address1이제, 말하고 싶은게 나왔다. int형으로 cast시에 문자가 포함되어 있으면 0이되는 것이다.
------ --------
a00100 aaaaa
a00101 bbbbb
a00102 ccccc
select cast('a00100' as unsigned);
아래가 바로 그 결과다.
cast('a00100' as unsigned)
--------------------------
0
아무튼 특별한 경우에는 생기지 않겠지만, 프로그래밍 언어와 적절히 조화되어 이러한 사태가 발생한다면 대략 낭패다.
내 옆에서 위와 같은 사태가 일어나는 것을 목격했었다. 그때는 심각하게 생각하지도 않았고, 설마 '니가 잘못했겠지라' 생각했다.
근데 오늘 살짝 위와 같은 문제가 발생했다. 다행히 초반에 잡아서 데이터 건수는 고작 6건. 손으로 살짝 고쳐주는 센스를 발휘했다.
다시 한번 잊지말자. delete, update시에는 select를 먼저해보자!
# by | 2007/08/08 01:18 | 개발 | 트랙백 | 덧글(2)






☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
코딩 오류로 저렇게 되버리면 롤백도 못한다는 ㅜㅜ