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

MySQL에서 복합 고유성(UNIQUE 제약 조건)을 적용하는 방법

MySQL에서는 UNIQUE 키워드를 사용하여 여러 컬럼에 걸친 복합 고유성(compound uniqueness)을 손쉽게 적용할 수 있습니다. 복합 고유 제약 조건은 두 개 이상의 컬럼 값을 조합했을 때 테이블 내에서 중복되지 않도록 보장해 주므로, 단일 컬럼만으로는 고유성을 판별하기 어려운 데이터를 다룰 때 특히 유용합니다.

복합 UNIQUE 제약 조건 추가 문법

테이블 생성 시 컬럼 정의 마지막에 UNIQUE 키워드를 추가하여 복합 고유 제약 조건을 설정할 수 있습니다. 기본 문법은 다음과 같습니다.

CREATE TABLE yourTableName
(
    yourColumnName1 datatype,
    yourColumnName2 datatype,
    yourColumnName3 datatype,
    .
    .
    N
    UNIQUE yourConstraintName(yourColumnName2, yourColumnName3)
);

예제: 복합 고유 제약 조건이 있는 테이블 만들기

개념을 이해하기 위해 실제로 몇 개의 컬럼을 가진 테이블을 생성하고, 두 컬럼에 고유 제약 조건을 적용해 보겠습니다. 아래 쿼리는 학생 정보를 저장하는 테이블을 만들면서 StudentNameStudentAge 컬럼 조합에 대해 고유성을 강제하는 예시입니다.

mysql> create table UniqueDemo
    -> (
    -> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> StudentName varchar(100),
    -> StudentAge int,
    -> StudentMarks int
    -> ,
    -> UNIQUE age_NameConstraint(StudentName,StudentAge)
    -> );
Query OK, 0 rows affected (0.76 sec)

위 예제에서는 age_NameConstraint라는 이름의 복합 고유 제약 조건을 정의했습니다. 이제 같은 이름과 나이를 가진 학생 레코드가 중복으로 삽입될 경우 MySQL이 오류를 반환하며 데이터 무결성을 지켜 줍니다.

SHOW INDEX로 제약 조건 확인하기

테이블에 설정된 인덱스 및 제약 조건의 이름은 SHOW INDEX 명령어를 통해 확인할 수 있습니다.

문법은 다음과 같습니다.

SHOW INDEX FROM yourTableName;

앞서 생성한 테이블의 고유 제약 조건을 조회해 보겠습니다.

mysql> SHOW INDEX FROM UniqueDemo;

실행 결과는 다음과 같습니다.

+------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Table      | Non_unique | Key_name           | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible |
+------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| uniquedemo |          0 | PRIMARY            |            1 | StudentId   | A         |           0 | NULL     | NULL   |      | BTREE      |         |               | YES     |
| uniquedemo |          0 | age_NameConstraint |            1 | StudentName | A         |           0 | NULL     | NULL   | YES  | BTREE      |         |               | YES     |
| uniquedemo |          0 | age_NameConstraint |            2 | StudentAge  | A         |           0 | NULL     | NULL   | YES  | BTREE      |         |               | YES     |
+------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
3 rows in set (0.33 sec)

결과 해석

출력 결과를 살펴보면 Non_unique 값이 0인 인덱스는 고유(unique) 인덱스를 의미합니다. 위 결과에서 PRIMARY 키와 함께 age_NameConstraint가 두 개의 행(Seq_in_index 1, 2)으로 표시된 것을 확인할 수 있는데, 이는 StudentNameStudentAge 두 컬럼이 하나의 복합 고유 인덱스로 묶여 있다는 뜻입니다. 즉, 이 두 컬럼의 조합이 동일한 레코드는 더 이상 테이블에 삽입될 수 없습니다.