위와같이 테이블과 데이터들을 생성해주고 title이 'article for Java'인 데이터의 body를 수정해주려고 했다.
UPDATE content
SET body ='this is an article about Java'
WHERE title='article for Java'
기본적인 방식인 UPDATE를 사용해 주었는데 에러가 발생했다.
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.
에러 내용은 safe update mode가 작동중에는 key값을 이용해야만 해당 데이터를 수정할수 있으며 safe mode를 중지시키는 방법이 나와 있다.
여기서 몇가지 궁금한 것들이 생겨 실험을 해보았다.
실험1. 서브쿼리 사용해보기
UPDATE content
SET body = 'this is an article about Java'
WHERE id = (select id from content where title = "article for Java")
위와 같이 where절에 title을 대입하여 찾는것이아닌 primary key인 id를 넣어주고 서브쿼리를 이용해 주었는데 다른 에러가 발생했다.
Error Code: 1093. You can't specify target table 'content' for update in FROM clause
서브쿼리의 from의 테이블과 update의 테이블이 서로 겹처서 난 에러이므로 쿼리문을 살짝 바꿔줫다.
UPDATE content
SET body = 'this is an article about Java'
WHERE id = (select content.id where title = "article for Java");
위와 같이 쿼리문을 바꿔주었음에도 처음 에러인 safe mode 에러가 발생했다....
실험2. 외래키 사용
당연하게도 primary key를 이용하면 update가 성공적으로 실행된다.
그렇다면 foreign key도 가능할까?
UPDATE content
SET body = 'this is an article about Java'
WHERE userid = 3 and title='article for Java'
위와같이 외래키인 userid와 title을 이용해보았다.
결과는 수정이 가능했다!!
보통 우리가 어떠한 서비스에 로그인을 하게되면 유저정보를 세션에 저장하게 된다. 그뜻은 세션을 통해 서버는 언제든지 유저정보에 접근이 가능하다는 것이며 위와 같이 해당 유저의 고유넘버(외래키)를 이용하면 해당 데이터베이스의 safe mode를 해제해 주지 않아도 원하는 데이터의 수정 및 삭제가 가능하다는 것이다. 즉, DB의 안전성은 유지한채 원하는 결과를 얻을수 있다.
물론 이런거 다 상관 없다면 그냥 safe mode를 끄면된다...
safe mode의 해제는 MySQL Workbench에서
Edit -> Preferences -> SQL Editor -> Safe Updates (맨아래에 위치) 체크박스를 uncheck으로 바꿔주면된다.
'Personal Research' 카테고리의 다른 글
SecurityContextHolder (0) | 2023.05.18 |
---|---|
BindException과 MethodArgumentNotValidException (0) | 2023.05.10 |
MySQL 서브쿼리 (0) | 2023.03.31 |
실험을 통해 깨닳은 추상화의 중요성 (0) | 2023.03.11 |