만약에 이름도 같고 나이도 같은 동명이인이 있다고 하면 어떻게 할까? 그들은 서로 다른 사람이지만 데이터만 봐서는 누가 누군지 구별할 수 없다. 따라서 각각 고유의 값을 가지는 키가 필요하다.
mysql> create table unique_cat (cat_id int not null,
-> name varchar(100),
-> age int,
-> primary key(cat_id));
Query OK, 0 rows affected (0.01 sec)
Primary key를 설정해준 unique_cat테이블을 만들어줬다. cat_id 라는 칼럼에 primary key를 설정해준 모습이다.
mysql> desc unique_cat;
+--------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| cat_id | int | NO | PRI | NULL | |
| name | varchar(100) | YES | | NULL | |
| age | int | YES | | NULL | |
+--------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
Cat_id의 Key부분에 PRI라고 PRIMARY KEY로 설정되었음을 보여주는 표시가 있다. 이제, 이 테이블에 데이터를 넣어보자.
mysql> insert into unique_cat (cat_id, name, age)
-> values (1, 'Fred', 23);
Query OK, 1 row affected (0.01 sec)
mysql> select * from unique_cat;
+--------+------+------+
| cat_id | name | age |
+--------+------+------+
| 1 | Fred | 23 |
+--------+------+------+
1 row in set (0.00 sec)
데이터가 잘 들어갔다. 2번째로 이번에는 cat_id를 2로 해서 데이터를 넣어보자.
mysql> insert into unique_cat (cat_id, name, age) values (2, 'Steve', 23);
Query OK, 1 row affected (0.00 sec)
mysql> select * from unique_cat;
+--------+-------+------+
| cat_id | name | age |
+--------+-------+------+
| 1 | Fred | 23 |
| 2 | Steve | 23 |
+--------+-------+------+
2 rows in set (0.00 sec)
데이터가 잘 들어갔다. 그럼 이번에는 이미 있는 cat_id를 중복해서 넣어보겠다.
mysql> insert into unique_cat (cat_id, name, age) values (1, 'James', 23);
ERROR 1062 (23000): Duplicate entry '1' for key 'unique_cat.PRIMARY'
이미 존재하고 있는 cat_id 를 넣어주려고 하자 (1) 오류가 발생하며 데이터가 들어가지 않는다.
그런데 primary key는 전부 다른 값을 넣어줘야 하기 때문에, 어디까지 넣어줬나 까먹거나 그럴 수 있다. 그래서 primary key를 자동으로 생성해줄 수 있다.
mysql> create table unique_cat2(cat_id INT NOT NULL AUTO_INCREMENT,
-> name VARCHAR(100),
-> age INT,
-> PRIMARY KEY(cat_id));
Query OK, 0 rows affected (0.01 sec)
mysql> desc unique_cat2;
+--------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+----------------+
| cat_id | int | NO | PRI | NULL | auto_increment |
| name | varchar(100) | YES | | NULL | |
| age | int | YES | | NULL | |
+--------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
Extra 에 auto_crement설정이 된 것을 확인 할 수 있다.
그리고 이번에는 cat_id를 생략하고 데이터를 넣어준다.
mysql> insert into unique_cat2(name, age) values('Skippy',4);
Query OK, 1 row affected (0.00 sec)
mysql> select * from unique_cat2;
+--------+--------+------+
| cat_id | name | age |
+--------+--------+------+
| 1 | Skippy | 4 |
+--------+--------+------+
1 row in set (0.00 sec)
데이터가 잘 들어간 것을 볼 수 있다. 하나 더 넣어줘보겠다.
mysql> insert into unique_cat2(name, age) values('Jip',2);
Query OK, 1 row affected (0.00 sec)
mysql> select * from unique_cat2;
+--------+--------+------+
| cat_id | name | age |
+--------+--------+------+
| 1 | Skippy | 4 |
| 2 | Jip | 2 |
+--------+--------+------+
2 rows in set (0.00 sec)
역시 잘 들어간다. 그러면 이미 존재하는 완전히 똑같은 이름과 나이를 입력하면 어떻게 될까.
mysql> insert into unique_cat2(name, age) values('Skippy',4);
Query OK, 1 row affected (0.00 sec)
mysql> insert into unique_cat2(name, age) values('Jip',2);
Query OK, 1 row affected (0.00 sec)
mysql> select * from unique_cat2;
+--------+--------+------+
| cat_id | name | age |
+--------+--------+------+
| 1 | Skippy | 4 |
| 2 | Jip | 2 |
| 3 | Skippy | 4 |
| 4 | Jip | 2 |
+--------+--------+------+
4 rows in set (0.00 sec)
기존에 존재하는 Skippy, Jip와 완전히 똑같은 이름과 나이를 가진 데이터를 입력했지만 각각 프라이머리 키로 구분되어 데이터가 들어간 것을 볼 수 있다.