MariaDB / DATA / 데이터 추가(INSERT), 수정(UPDATE), 삭제(DELETE)
MariaDB에서 행을 추가할 때는 INSERT, 기존 행의 값을 바꿀 때는 UPDATE, 행을 삭제할 때는 DELETE를 사용합니다. UPDATE와 DELETE의 WHERE는 작업 대상 행을 정하며, 생략하면 테이블 전체가 대상이 됩니다. 아래에서는 하나의 실습 테이블로 세 명령의 차이를 확인하고 InnoDB 트랜잭션으로 변경을 취소하는 방법까지 살펴봅니다.
실습 준비와 세 명령의 차이
MariaDB에 SQL을 실행할 수 있는 클라이언트로 접속하고, 실습용 데이터베이스에서 CREATE·SELECT·INSERT·UPDATE·DELETE 권한이 있는 계정을 사용합니다. 아래 예제는 learning 데이터베이스가 미리 준비되어 있다고 가정합니다. 운영 데이터베이스 대신 본인이 관리하는 연습 환경을 선택하고, dml_basics_demo라는 테이블이 이미 있으면 다른 이름으로 바꾸세요. 기존 테이블을 자동 삭제하는 구문은 넣지 않았습니다.
USE learning;
CREATE TABLE dml_basics_demo (
id INT PRIMARY KEY,
name VARCHAR(40) NOT NULL,
quantity INT NOT NULL DEFAULT 0,
note VARCHAR(100) NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
SELECT DATABASE() AS current_database;
SHOW CREATE TABLE dml_basics_demo;
SHOW CREATE TABLE 결과에서 InnoDB와 열 정의를 확인합니다. 이후 예제는 같은 데이터베이스의 이 테이블을 순서대로 사용합니다. 테이블 생성 같은 구조 변경은 데이터 변경과 트랜잭션 동작이 다르므로, CREATE TABLE은 아래 START TRANSACTION보다 먼저 실행합니다.
| 명령 | 하는 일 | 대상을 정하는 방법 |
|---|---|---|
| INSERT INTO | 새 행 추가 | 열 목록과 VALUES |
| UPDATE … SET | 기존 행의 열 값 변경 | WHERE 조건 |
| DELETE FROM | 행 전체 삭제 | WHERE 조건 |
INSERT: 열과 값을 대응해 행 추가
INSERT의 열 목록 순서와 각 VALUES 묶음의 값 순서를 맞춥니다. 문자열은 작은따옴표로 감싸고 숫자는 숫자로 작성합니다. 열 목록을 명시하면 테이블의 물리적인 열 순서만 보고 값을 맞추는 실수를 줄일 수 있습니다.
INSERT INTO dml_basics_demo (id, name, quantity, note)
VALUES (1, '연필', 10, '진열대 A');
SELECT ROW_COUNT() AS inserted_rows;
INSERT INTO dml_basics_demo (id, name)
VALUES (2, '공책');
SELECT ROW_COUNT() AS inserted_rows;
INSERT INTO dml_basics_demo (id, name, quantity)
VALUES (3, '지우개', 5), (4, '자', 7);
SELECT ROW_COUNT() AS inserted_rows;
SELECT id, name, quantity, note
FROM dml_basics_demo ORDER BY id;
추가 행 수는 차례대로 1·1·2입니다. id=2는 생략한 quantity에 기본값 0, note에 NULL이 들어갑니다. 최종 데이터는 연필 10개, 공책 0개, 지우개 5개, 자 7개인 네 행입니다. DEFAULT나 NULL 허용 여부가 다른 테이블에서는 생략 결과도 달라지며, 필수 열에 유효한 값이 없으면 오류가 날 수 있습니다. NULL은 값이 없다는 표시이며 빈 문자열과 다릅니다.
PRIMARY KEY인 id가 이미 있는 값을 다시 추가하면 중복 키 오류가 납니다. 오류를 숨기기 위해 INSERT IGNORE를 일괄 붙이기보다, 새 행 추가인지 기존 행 수정인지 먼저 판단하세요. 이 글은 명시한 값으로 추가하는 기본 구문을 다루며 다른 조회 결과를 복사하는 INSERT … SELECT와 구분합니다.
UPDATE: 대상 확인 후 한 열 또는 여러 열 수정
UPDATE는 SET에 변경할 열과 값을 적습니다. 먼저 같은 WHERE 조건으로 SELECT를 실행해 대상이 맞는지 보고, 실제 UPDATE에서 조건을 그대로 사용합니다. 기본 키처럼 대상을 고유하게 식별하는 값은 이름만으로 찾는 것보다 범위를 명확하게 만들기 쉽습니다.
SELECT id, name, quantity, note
FROM dml_basics_demo WHERE id = 1;
UPDATE dml_basics_demo
SET quantity = 12, note = '재고 확인 완료'
WHERE id = 1;
SELECT ROW_COUNT() AS changed_rows;
UPDATE dml_basics_demo
SET quantity = quantity + 2
WHERE id = 3;
SELECT ROW_COUNT() AS changed_rows;
SELECT id, name, quantity, note
FROM dml_basics_demo ORDER BY id;
첫 UPDATE는 연필의 수량을 12로 바꾸고 note도 변경합니다. 쉼표는 여러 열 대입을 구분하며 WHERE 앞에는 붙이지 않습니다. 둘째 UPDATE는 지우개의 기존 수량 5에 2를 더해 7로 바꿉니다. 공책과 자는 그대로입니다. 행을 추가하는 INSERT와 달리, 조건에 맞는 행이 없으면 새 행을 만들지 않습니다.
ROW_COUNT()는 직전 문장의 영향을 받은 행 수를 확인할 때 사용합니다. 여기서는 변경 문장 직후 호출합니다. 기본 UPDATE 결과는 실제 값이 바뀐 행 수이므로 같은 값으로 다시 지정하면 0일 수 있습니다. 클라이언트 연결 옵션에 따라 일치한 행 수를 보고하는 경우도 있으므로 0이라는 숫자만으로 행이 존재하지 않는다고 단정하지 마세요.
DELETE: 특정 행 삭제와 테이블 삭제 구분
DELETE는 열 하나의 값이 아니라 조건에 맞는 행 전체를 삭제합니다. note만 비우려는 목적이면 UPDATE로 note=NULL을 지정하는 작업입니다. 외래 키가 연결된 실제 데이터에서는 삭제가 거절되거나 연결된 행에 영향을 줄 수 있으므로 관계와 규칙도 확인해야 합니다.
SELECT id, name, quantity
FROM dml_basics_demo WHERE id = 2;
DELETE FROM dml_basics_demo WHERE id = 2;
SELECT ROW_COUNT() AS deleted_rows;
SELECT id, name, quantity
FROM dml_basics_demo ORDER BY id;
deleted_rows는 1이고 최종 id는 1·3·4입니다. DELETE로 데이터를 지워도 테이블 정의는 남습니다. 테이블 자체를 없애는 DROP TABLE이나 모든 행을 빠르게 비우는 TRUNCATE TABLE과 혼동하지 마세요. WHERE 없는 DELETE FROM dml_basics_demo는 남아 있는 모든 행을 대상으로 한다는 점을 특히 주의합니다.
트랜잭션으로 변경을 확인하고 되돌리기
START TRANSACTION은 여러 변경을 하나의 작업 단위로 다루기 위해 사용합니다. 아래 예제는 앞에서 만든 InnoDB 테이블의 남은 세 행을 일시적으로 바꾸고, 같은 접속 세션에서 ROLLBACK으로 되돌립니다. 직접 실습하는 테이블인지 다시 확인한 뒤 블록 전체를 실행하세요.
START TRANSACTION;
UPDATE dml_basics_demo SET quantity = 99 WHERE id = 1;
DELETE FROM dml_basics_demo WHERE id = 4;
SELECT id, quantity FROM dml_basics_demo ORDER BY id;
ROLLBACK;
SELECT id, quantity FROM dml_basics_demo ORDER BY id;
ROLLBACK 전에는 id=1의 수량이 99이고 id=4가 사라집니다. 뒤에는 id=1·3·4의 수량이 다시 12·7·7이 됩니다. 실제 변경을 확정하려는 작업이라면 내용을 검토한 후 COMMIT을 실행하지만, 이 연습 블록은 취소 동작을 보여 주기 위해 ROLLBACK으로 끝냅니다. GUI에서 자동 커밋 설정이나 접속이 달라지면 기대한 취소가 되지 않을 수 있으므로 같은 세션에서 트랜잭션을 유지해야 합니다.
자동 커밋이 켜진 상태에서 트랜잭션을 시작하지 않고 이미 확정한 변경은 나중의 ROLLBACK으로 되돌릴 수 없습니다. InnoDB처럼 트랜잭션을 지원하는 엔진이 필요하며, CREATE·ALTER·DROP·TRUNCATE 등 암시적 커밋을 유발하는 구문을 데이터 변경 사이에 섞지 않습니다. 트랜잭션은 백업의 대체 수단도 아닙니다.
오류와 실제 애플리케이션에서 확인할 점
- 문법 오류: INSERT의 열 수와 값 수, 여러 VALUES 사이 쉼표, UPDATE의 SET과 WHERE 위치, 문장 끝 세미콜론을 확인합니다.
- 변경 행 수가 예상과 다름: 데이터베이스·테이블·WHERE 조건을 다시 확인합니다. 조건에 맞는 행이 여러 개일 수 있고, UPDATE는 같은 값 대입 때문에 실제 변경 수가 줄 수 있습니다.
- Safe Updates 오류: 클라이언트가 위험한 변경을 막는 설정일 수 있습니다. 보호 옵션부터 끄기보다 고유 키와 조건을 검토해 작업 대상을 명확하게 합니다.
- 입력값으로 SQL을 만드는 코드: 사용자가 입력한 문자열을 SQL에 이어 붙이지 말고 드라이버의 준비된 문장과 매개변수 바인딩을 사용합니다. 여기의 고정 SQL 실습을 그대로 문자열 조립 방식으로 확장하지 않습니다.
실습을 처음부터 반복하려면 새 실습 이름을 사용하거나, 자신이 만든 dml_basics_demo의 필요 여부를 확인한 뒤 별도로 정리합니다. 이 글의 모든 예제를 운영 테이블 이름으로 일괄 치환해 실행하지 마세요. 실제 변경은 대상 조회·영향 범위 확인·결과 검증을 한 단위로 진행하는 것이 핵심입니다.




