Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 n번째 행(레코드)을 삭제하는 방법

MySQL에서 테이블의 n번째 행을 삭제하려면 DELETE 문과 서브쿼리(subquery)를 함께 사용해야 합니다. 이 글에서는 예제 테이블을 만들고, 실제로 두 번째 행을 삭제하는 전체 과정을 단계별로 살펴보겠습니다.

1단계: 테이블 생성하기

먼저 자동 증가(AUTO_INCREMENT) 기본키를 가진 간단한 학생 테이블을 생성합니다.

mysql> create table DemoTable1
    -> (
    -> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> StudentName varchar(100)
    -> );
Query OK, 0 rows affected (0.99 sec)

2단계: 샘플 데이터 삽입하기

INSERT 명령을 사용하여 테이블에 여러 개의 레코드를 추가합니다.

mysql> insert into DemoTable1(StudentName) values('Larry');
Query OK, 1 row affected (0.14 sec)

mysql> insert into DemoTable1(StudentName) values('Sam');
Query OK, 1 row affected (0.13 sec)

mysql> insert into DemoTable1(StudentName) values('Mike');
Query OK, 1 row affected (0.18 sec)

mysql> insert into DemoTable1(StudentName) values('Carol');
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable1(StudentName) values('David');
Query OK, 1 row affected (0.16 sec)

mysql> insert into DemoTable1(StudentName) values('Bob');
Query OK, 1 row affected (0.13 sec)

3단계: 저장된 데이터 조회하기

SELECT 명령으로 테이블에 저장된 전체 레코드를 확인합니다.

mysql> select * from DemoTable1;

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1         | Larry       |
| 2         | Sam         |
| 3         | Mike        |
| 4         | Carol       |
| 5         | David       |
| 6         | Bob         |
+-----------+-------------+
6 rows in set (0.00 sec)

4단계: n번째 행 삭제하기

다음은 두 번째(n=2) 행을 삭제하는 쿼리입니다.

mysql> delete from DemoTable1 where StudentId = (select StudentId from (select StudentId from DemoTable1 order by StudentId limit 1,1) as tbl);
Query OK, 1 row affected (0.19 sec)

쿼리 동작 원리

  • order by StudentId limit 1,1: StudentId 기준으로 정렬한 후 첫 번째 행 1개를 건너뛰고(offset), 그다음 1개의 행만 가져옵니다. 즉, 두 번째 행을 선택합니다.
  • 서브쿼리를 한 번 더 감싸고 별칭(as tbl)을 붙인 이유는, MySQL에서 DELETEUPDATE 대상 테이블을 동일 쿼리 내에서 직접 참조할 수 없기 때문입니다. 파생 테이블(derived table)로 감싸면 이 제약을 피할 수 있습니다.
  • n번째 행을 삭제하려면 limit n-1, 1 형태로 오프셋 값을 조정하면 됩니다. 예를 들어 세 번째 행은 limit 2,1로 지정합니다.

5단계: 삭제 결과 확인하기

레코드가 정상적으로 삭제되었는지 테이블의 전체 데이터를 다시 조회합니다.

mysql> select * from DemoTable1;

실행 결과는 다음과 같습니다. 두 번째 레코드(Sam)가 성공적으로 삭제된 것을 확인할 수 있습니다.

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1         | Larry       |
| 3         | Mike        |
| 4         | Carol       |
| 5         | David       |
| 6         | Bob         |
+-----------+-------------+
5 rows in set (0.00 sec)

마무리

이처럼 MySQL에서 특정 순번의 행을 삭제할 때는 ORDER BYLIMIT를 활용한 서브쿼리로 대상 행의 ID를 찾은 뒤, 이를 DELETE 문의 조건으로 사용하면 됩니다. 다만 실무 환경에서는 물리적 위치 기반의 "n번째 행" 개념이 항상 일정하지 않으므로, 가능하면 명확한 조건(기본키 등)으로 삭제하는 것이 안전합니다.