DML - 수정/삭제/삽입/조회 (CRUD) 와 같은 데이터를 실제로 조작하는 문법
INSERT INTO test_table (name, email) VALUES ('test', '[email protected]');
-- 삽입 시에 (name, email) 처럼 값을 넣을 컬럼들을 지정할 수 있다.
-- 이후 VALUES 뒤에는 괄호 안에 각 컬럼별로 넣을 값을 지정한다.
-- 컬럼 목록과 값 목록은 순서와 개수가 동일해야 한다. (name, age 순서로 적고 123, 'name1' 처럼 적으면 오류가 난다.)
INSERT INTO test_table VALUES (NULL, 'test', '[email protected]');
-- 이런식으로 컬럼 지정을 생략한다면 모든 컬럼에 대해 각각 값을 넣어줘야 한다.
-- 이 경우에도 테이블의 컬럼 순서에 맞게 값을 넣어야 하며, 자동 증가 값(PK) 인 경우 NULL 을 넣으면 값이 알아서 채워진다.
INSERT INTO test_table (name, email) VALUES
('test1', '[email protected]'),
('test2', '[email protected]'),
('test3', '[email protected]');
-- 이런식으로 여러 데이터를 한꺼번에 삽입 할 수도 있다.
-- 배치 처리에 유용하다.
-- 보통은 값을 넣을 컬럼 목록을 생략하지 않고 지정하는 것이 좋다.
-- 불필요하게 쿼리가 길어지기도 하고, 나중에 컬럼이 새로 추가되었을때도 기존 쿼리의 오류를 최소화 할 수 있다.
-- 물론 컬럼이 새로 추가되었을때 해당 컬럼이 필수값이라면 기존 쿼리도 오류가 날수도 있다.
UPDATE test_table SET name = 'changed', email = '[email protected]' WHERE id = 1;
-- SET 뒤에 수정할 컬럼과 값을 적어주면 되고, 여러 값을 수정하려면 쉼표로 구분해 적어주면 된다.
-- where 절을 통해 테이블의 여러 행 중 어떤 행을 수정할 지 지정할수 있다.
-- where 절 없이 수정한다면 모든 행이 수정되므로 주의해야 한다.
-- 만약 MySQL 에서 안전 업데이트 모드를 사용한다면 WHERE 절에는 PK 컬럼을 반드시 지정해야 한다. (혹은 LIMIT 으로 데이터의 양을 조절해야 한다.)
DELETE FROM test_table WHERE id = 1;
-- WHERE 절에 pk 나 컬럼을 지정해 삭제할 데이터의 조건을 정할 수 있다.
-- 만약 조건이 없다면 해당 테이블의 모든 데이터가 삭제되므로 무조건 삭제할 조건을 넣어줘야 한다.
-- 만약 삭제하는 데이터를 참조하는 자식 테이블(FK) 이 있는 경우 오류가 발생하고 삭제되지 않는다.
-- 이런 경우 해당 데이터를 참조하는 자식을 먼저 삭제한 후 최종적으로 부모를 삭제해야 한다.
-- SET FOREIGN_KEY_CHECKS = {1 or 0} 으로 외래키 제약을 잠시 끌수는 있다.
-- 다만 이런식으로 강제로 삭제하면 위험하므로 테스트 데이터 삭제 정도에만 사용해야 한다.