mysql 업데이트 오류 문의 드립니다.

김제연   
   조회 4053   추천 0    

 UPDATE `boomr2`.`assigns` SET `del_status`='배정완료' WHERE `od_no`='*1753*85****458827';


이 쿼리를 하면 

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.


오류가 발생합니다... pk 키를 지정 안해서 그런것으로 알고 od_no 를 pk 키로 지정을 한 상태인데도 .. 

똑같은 오류가 발생합니다.

pk는 한 테이블에 1개여야 하나요? id와 od_no를 pk로 지정한 상태 입니다.

safe_mode 끄면 되겠지만.. 끄지 않고  정상적으로 실행 하는 방법은 없을까요? 원인을 알고 싶습니다.

짧은글 일수록 신중하게.
무아 2018-10
구글링을 해보니 pk 문제는 아니고 safe 모드에선 update 와 where를 함께 쓰면 그러는 것 같네요.
update를 where 없이 쓴다? 오홍...
구글링 해보니 이런 방법으로 가능하겠네요.
https://stackoverflow.com/questions/30198070/update-without-where-clause
     
김제연 2018-10
update를 where 절이 없이 어떻게 업데이트 해야 하나요? 들어가보니 .. 무자게 복잡한듯?
반대 아닌가요? where절 없이 하면.. 저 오류가 뜨고 ..
where 절이 있으나 pk 칼럼이 where절에 없으면 저 오류가 뜨는데

게 경우는 od_no가 pk 임에도 불구하고 뜨고 있어서요.
          
무아 2018-10
그렇다면 od_no 값이 db 내에 중복되는 놈이 있는 거 아닐까요? pk 로 설정해주기 전에 이미 중복된 것이 있었다든지...

이런 얘기도 있네요. [ 다중컬럼을 합쳐서 중복금지]

단일 PK/UK의 경우 단일컬럼에 대해서만 중복 금지를 하지만 다중 PK/UK는 설정된 다중컬럼을 합쳐서 중복금지를 합니다. 당연한 이야기겠지만요..^^
출처: http://greenalice.tistory.com/73 [제멋대로 말라]

pk를 2개 썼다면 (2개의 컬럼을 pk로 썼다는 표현이 맞겠죠)  where 에서도 두개의 pk를 모두 사용해야하는 거 아닐까 싶기도 하네요.
다시말해 od_no 컬럼이 pk 가 되는 것이 아니라
원래 id 컬럼과 od_no 컬럼 모두 합친 것이 pk 가 되는 ..

그래서 다시 본문의 문제로 돌아가서 보면 od_no 를 pk 로 추가한다고 해도 원하는 기능을 하는데 id 가 필요하고 그럼 아무 의미가 없어지니까
머리아프고 그러니까 사람들이 safe 모드를 끄고 쓰라는 글들도 나오고..
그러지 않으려고
https://stackoverflow.com/questions/30198070/update-without-where-clause  이렇게 해보려고 하는 거 아닐까 싶습니다.
               
김제연 2018-10
답변 정말 감사드립니다.. 구글링까지 해주시고 ..
지금 확인해 보니 .. 처음엔 id 만 pk  id로 업데이트를 하려면.. 처음부터 id값을 가지고 있어야 하거나
따로따로 select 해야 하니 그냥 od_no 로 업데이트 하려니 od_no가 pk 가 아니라서 오류
od_no 가 pk 여도 왜안되나 질문 올렸는데 .. 지금 해보니
pk 가 두개면.. 2개를 넣어야 하네요
위에 말씀하신데로 ..
where절에 id = 몇번 and od_no=몇번 이런식으로 써야 하니 .. od_no의 pk 도 아무 의미가 없어져 버리네요
uuid 로 관리해서 uuid 를 pk를 써봐야 겠네요 ..
그런데 또 검색 해보니까 guid 나 uuid 값을 pk로 하면.. 성능상 완전 안좋다고 해서... 뭐 어떻게 하라는 건지 모르겠습니다 ㅋㅋ


그리고 무아님 개발쪽 하시는것 같은데 .. 혹시 필드의 .. 상태값을 영어로 할때와 한글로 할때 검색이나 .. 저장 불러오기시
성능차이가 있을까요 .. 예를들면..
배송완료라고 치면..
한글로 저장할때와 delivery_complete 이런식으로 영어로 할때 나중에 검색할때 문제가 있을까요?

예전엔 영어로 했는데 굳이 ... select해와서 다시 한글로 변환해주고 그럴 필요가 있나도 싶고 ..
c#하시는분들 보면 변수도 완전 한글로 만들어서 쓰시는분들도 있으시던데요..
                    
무아 2018-10
저는 db쪽을 개발하는게 아니라서 어설픈 답변이 될 듯 합니다. ^^
필드의 상태값을 한글로 하나 영어로 하나 서버 입장에선 그게 그거라고 봅니다. 서버가 영어를 알아먹는 것도 아닐테니까요.
단, 한글로 할 경우에는 늘 있어왔던 인코딩 문제는 조심해야겠지요. 다 같은 한글이래도 EUC-KR 과 UTF8 은 다른 코드이니까요.
그리고 서버가 좀 더 똑똑해서 자연어처리 기능이 있다면 한글 보다 영어가 더 성능이 뛰어나겠죠. 아무래도 학습한 데이터의 양이 차이날테니.
변수를 완전 한글로 한다라... 제멋에 혼자 코딩하는 사람이라면 문제 없겠지만... 본인도 그렇고 협업하는 사람도 그렇고.. 애로사항이 꽃필듯 합니다.
                    
DoubleSH 2018-10
뭐 시스템 입장에선 UTF 일때는 한글이 3바이트 일뿐이겠죠.
영어보다 한글이 짧을 것 같으면서도

근데 배송완료같은 상태면 그냥 0 1 2 3  코드로 저장하면 되잖아요? -_-?

그리고 세이프 모드로 쓰는게 '비정상' 아닌가용?
                         
김제연 2018-10
답변 감사 합니다.. 참고 하겠습니다.. 제가 초보라 .. 아직 숫자로 나오면 볼수가 없어서 .. 상수로 만들어놓고 쓰면 되는데 .. 첨부터 잘못 배워서 ..ㅋ

세이프 모드는 그냥 설치 기본 옵션이고 .. 저번에 null 로 전체 업데이트가 된적이 있어서 그냥 냅두는 중입니다.
                         
DoubleSH 2018-10
http://jwgye.tistory.com/31

근데 질문하신 메시지가 이거 맞나용?

이건 where 절 없이 update 할 경우를 workbench 차원에서 막는 기능이에요 ㅋㅋㅋ
말씀하신대로 실수로 전체 update 시킬 경우를 방지하는건데, 이건 필요하면 본인이 해제하시면되구요

HeidiSQL 을 쓸경우에는 where 절이 없으면 '진짜 할거야?' 라고 물어봅니다.


QnA
제목Page 4102/5707
2015-12   1670632   백메가
2014-05   5135731   정은준1
2022-06   3936   장동건2014
2018-04   3936   Nikon
2015-08   3936   김건우
2015-09   3936   라면먹고갈래
2015-08   3936   최창현
2014-11   3936   제주김재민
2017-04   3936   호박고구마
2014-12   3936   하상욱
2015-11   3936   푸하히
2015-08   3936   김정윤
2018-07   3936   조약돌
2015-07   3936   허진형ALpha
2016-12   3935   insert
2018-06   3935   별혼
2018-04   3935   김주현
2018-05   3935   메트
2019-01   3935   김건우
2014-09   3935   제상현
2017-05   3935   준호
2017-03   3935   조재형3