MySQL - PRIMARY KEY

임재현·2021년 4월 28일
0

MySQL

목록 보기
7/52

Primary Key

만약에 이름도 같고 나이도 같은 동명이인이 있다고 하면 어떻게 할까? 그들은 서로 다른 사람이지만 데이터만 봐서는 누가 누군지 구별할 수 없다. 따라서 각각 고유의 값을 가지는 키가 필요하다.

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와 완전히 똑같은 이름과 나이를 가진 데이터를 입력했지만 각각 프라이머리 키로 구분되어 데이터가 들어간 것을 볼 수 있다.

profile
임재현입니다.

0개의 댓글