오늘은 네가 새로 쌓아가는 지식의 벽돌 중 또 하나 중요한 걸 다뤄볼 거야 — 바로 데이터 업데이트! PostgreSQL에서 UPDATE 명령어로 기존 정보를 어떻게 바꾸는지 볼 거야. 왜 중요하냐고? 현실 세계에서 데이터는 절대 고정돼 있지 않으니까. 예를 들어, 네 친구가 전화번호를 바꿨거나, 학생이 다른 반으로 옮겼다면, 당연히 그 데이터를 DB에서 바꿔줘야겠지.
네가 학교에서 좋아했던 Svetka Sokolova가 갑자기 Svetka Khachaturyan이 됐다면(인생이란 그런 거지), DB에도 그걸 반영해야 해. 이런 식으로 데이터를 바꿔야 하는 상황은 진짜 자주 나와:
- 레코드에 있는 실수 수정하기.
- 정보 업데이트(이사, 상태 변경 등).
- 여러 데이터 한 번에 바꾸기, 예를 들어 직원들 월급 올려주기.
데이터 업데이트는 테이블의 한 줄 또는 여러 줄에서, 한 컬럼 또는 여러 컬럼의 값을 바꾸는 방법이야. 새로운 레코드를 추가하는 게 아니고!
UPDATE 명령어 문법
PostgreSQL에서 UPDATE 명령어는 꽤 직관적인 문법을 가지고 있어. 구조를 한번 보자:
UPDATE 테이블
SET 컬럼1 = 값1,
컬럼2 = 값2
WHERE 조건;
설명하자면:
테이블: 뭔가 바꿀 테이블 이름.SET column = value: 어떤 컬럼을 어떤 값으로 바꿀지 지정하는 부분.WHERE 조건: 어떤 줄을 업데이트할지 정하는 조건(이거 진짜 중요해, 안 그러면 다 바뀜...!).
핵심 포인트: WHERE를 빼먹거나 잘못 쓰면, 테이블의 모든 줄이 다 바뀌어버릴 수 있어. 이거 진짜 큰일 날 수 있으니까 조심!
예시: 학생 이름 바꾸기
예를 들어, students라는 테이블에 id, name, email 컬럼이 있다고 해보자. id = 1인 학생의 이름을 "Maria Chi"로 바꾸고 싶어.
UPDATE students
SET name = 'Maria Chi'
WHERE id = 1;
이 명령어는 id = 1인 줄을 찾아서 name 컬럼을 새 값으로 바꿔줄 거야. 쉽지?
여러 컬럼 한 번에 업데이트하기
가끔은 한 레코드에서 여러 값을 한 번에 바꿔야 할 때가 있어. 예를 들어, 학생이 이름도 바꾸고 이메일도 바꿨다고 해보자. 이렇게 하면 돼:
UPDATE students
SET name = 'Otto Lin',
email = 'otto.lin@example.com'
WHERE id = 2;
여기서는 id = 2인 학생의 name과 email을 둘 다 바꿔주는 거야. PostgreSQL에서는 SET 부분에 컬럼=값 쌍을 콤마로 여러 개 쓸 수 있어.
여러 줄 한 번에 업데이트하기
여러 줄의 데이터를 한 번에 바꿔야 할 땐 어떻게 할까? 예를 들어, 학생 그룹을 새 그룹으로 옮기고 싶을 때. group_number라는 필드가 있다고 치고, 101번 그룹 학생들을 202번 그룹으로 옮기고 싶으면:
UPDATE students
SET group_number = 202
WHERE group_number = 101;
이 명령어는 group_number가 101인 모든 줄을 찾아서 202로 바꿔줄 거야.
5. WHERE 조건: 진짜 조심!
아까도 말했지만, WHERE는 네 구명튜브야. 이거 없으면 테이블의 모든 줄이 다 바뀌어버려. 예를 들어, 아래 명령어는 모든 학생의 그룹을 202로 바꿔버려. 101번 그룹만 바꾸고 싶었는데, 이러면 다 바뀌는 거지. 이건 진짜 원하지 않을 거야:
UPDATE students
SET group_number = 202;
그러니까 WHERE는 항상 꼭 써! 실수로 데이터 다 날릴 수도 있으니까. 조심 또 조심!
UPDATE 명령어는 테이블의 컬럼을 바꾸는 명령어라고 생각하면 돼. 줄을 바꾸는 게 아니라, 컬럼의 값을 바꾸는 거지. WHERE가 있어야만 일부 줄만 바뀌는 거야.
다른 테이블의 데이터로 업데이트하기
가끔은 값을 직접 입력하는 게 아니라, 테이블 A의 값을 테이블 B의 데이터로 업데이트해야 할 때가 있어. 이런 경우 진짜 많아 — 예를 들어, 계산 결과는 한 테이블에 있고, 사용자 프로필은 다른 테이블에 있을 때.
예를 들어, students 테이블에서 debt 컬럼을 payments 테이블의 due_amount 값으로 업데이트해야 한다고 해보자. 각 students 레코드는 payments의 student_id와 매칭돼.
문법은 이렇게 돼:
UPDATE students
SET debt = payments.due_amount
FROM payments
WHERE students.id = payments.student_id;
이게 어떻게 동작하냐면:
- PostgreSQL이
FROM payments를 데이터 소스로 사용해. WHERE조건으로 두 테이블의 줄을 연결해.payments에 매칭되는students줄만 업데이트해.
중요한 점: 이 UPDATE ... FROM 안에서는 사실상 숨겨진 JOIN이 일어나는 거야. JOIN 키워드는 없지만, 실제로는 조인하는 거지.
실제로 내부적으로는 이런 식으로 조인이 일어나고 있어. 대충 이렇게 생각하면 돼:
UPDATE students
SET debt = p.due_amount
FROM payments p
JOIN students s ON s.id = p.student_id
WHERE students.id = p.student_id;
뭐가 바뀌는지 미리 확인하기
UPDATE를 실행하기 전에, 정확히 뭐가 바뀌는지 미리 보는 게 진짜 현명해. SELECT로 똑같이 써보면 돼:
SELECT
students.id,
students.name,
students.debt AS old_debt,
payments.due_amount AS new_debt
FROM students
JOIN payments ON students.id = payments.student_id;
이 결과는 이렇게 보여줄 거야:
- 예전 빚 값(
old_debt); payments테이블에서 가져올 새 값(new_debt).
이런 식으로 하면 논리가 맞는지 미리 체크할 수 있어서, 데이터가 영영 덮어써지기 전에 실수 방지할 수 있어.
잠재적인 함정들
payments에 한 학생당 여러 레코드가 있으면,UPDATE에서 에러가 나:more than one row returned. 이럴 땐MAX,SUM,LIMIT 1같은 집계함수를 쓰거나,payments의student_id가 유일한지 확인해야 해.UPDATE ... FROM은 PostgreSQL만의 특징이라, MySQL 같은 다른 DBMS에서는 이렇게 안 돼.
실전 예시
예시 1: 학생 상태 바꾸기
예를 들어, 코스를 끝낸 학생들은 "졸업생" 상태로 바꿔야 해. status라는 컬럼이 있다고 치고, completed_course = true인 학생들의 상태를 바꾸려면:
UPDATE students
SET status = '졸업생'
WHERE completed_course = true;
예시 2: 직원 월급 올리기
employees 테이블이 있고, 영업부서 직원들 월급을 10% 올리고 싶으면:
UPDATE employees
SET salary = salary * 1.10
WHERE department = 'Sales';
SET 부분에서 바로 수식도 쓸 수 있어. 여러 명의 데이터를 한 번에 바꿀 때 진짜 편해.
예시 3: 조건부 업데이트
가끔은 조건에 따라 다르게 업데이트해야 할 때가 있어. 예를 들어, 월급이 50,000보다 적으면 20% 올리고, 그 이상이면 10%만 올리고 싶을 때:
UPDATE employees
SET salary = CASE
WHEN salary < 50000 THEN salary * 1.20
ELSE salary * 1.10
END;
이 명령어는 CASE 구문을 써서 salary 값에 따라 다르게 업데이트해.
UPDATE 쓸 때 흔한 실수들
이미 눈치챘겠지만, 제일 흔한 실수는 뭘까? 맞아, WHERE를 빼먹는 거야. 상상해봐: 10,000명 직원이 있는 DB에서 실수로 전부 월급을 올려버렸어. 직원들은 좋아하겠지만, 너의 커리어에는... 별로 안 좋을 수도 있지.
또 다른 흔한 실수는 잘못된 컬럼을 업데이트하는 거야. 항상 뭐가 어디에 들어가는지 두 번 확인해! UPDATE 전에 SELECT 한 번만 해도 시간 엄청 아낄 수 있어.
GO TO FULL VERSION