SQL - PRIMARY KEY, FOREIGN KEY

Jungmin·2022년 11월 10일
1

SQL

목록 보기
12/17

⏹ PRIMARY KEY (기본 키)

  • 테이블의 각 레코드 식별
  • 중복되지 않은 고유값 포함
  • NULL값을 가질 수 없음
  • 테이블 당 하나의 기본키를 가짐

    key값에 PRI가 있는 컬럼 -> PRIMARY 키

PRIMARY 키 생성문법 1

💡 CONSTRAINT : 생략가능

  • 하나의 컬럼을 기본 키로 설정하는 경우
  • 여러개의 컬럼을 기본 키로 설정하는 경우

PRIMARY 키 삭제 문법

ALTER TABLE tablename
DROP PRIMARY KEY;

💡 하나의 컬럼, 여러개의 컬럼 모두 삭제방법 동일

PRIMARY 키 생성문법 2

: 이미 만들어진 테이블에 PRIMARY 속성 추가
ALTER TABLE tablename ADD PRIMARY KEY (col1, col2,..);

  • 하나의 컬럼을 PRIMARY KEY 설정
mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
| sex   | char(1)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

mysql> ALTER TABLE person ADD PRIMARY KEY (id);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc person;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
| sex   | char(1)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
  • 여러개의 컬럼을 기본 키로 설정
    ❗ CONSTRAINT PK_animal --> animal테이블의 Primary Key 임의의 이름 설정 (생략 가능, 생략 시 자동 생성)
mysql> desc animal;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(16) | YES  |     | NULL    |       |
| type  | varchar(16) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> ALTER TABLE animal ADD CONSTRAINT PK_animal PRIMARY KEY(name, type);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc animal;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(16) | NO   | PRI | NULL    |       |
| type  | varchar(16) | NO   | PRI | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

⏹ FOREIGN KEY (외래 키)

  • 한 테이블을 다른 테이블과 연결해주는 역할
  • 한 테이블 내 여러개 존재할 수 있음.
  • 참조되는 테이블의 항목은 그 테이블의 기본 키 혹은 단일 값.
  • FOREIGN 키로 지정된 값은 연결되는 다른 테이블이 필요 REFERENCES

FOREIGN 키 생성문법 1

mysql> CREATE TABLE orders(oid int not null,
    -> order_no varchar(16),
    -> id int,
    -> PRIMARY KEY (oid),
    -> CONSTRAINT FK_person FOREIGN KEY (id) REFERENCES person(id));

  • CREATE TABLE 에서 FOREIGN KEY 지정하는 경우, CONSTRAINT 생략할 수 있다.
mysql> CREATE TABLE job(
    -> jid int not null,
    -> name varchar(16),
    -> id int,
    -> PRIMARY KEY (jid),
    -> FOREIGN KEY (id) REFERENCES person(id));
Query OK, 0 rows affected (0.02 sec)

mysql> DESC job;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| jid   | int         | NO   | PRI | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
| id    | int         | YES  | MUL | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

💡 CONSTRAINT 자동생성 시 확인 문법
SHOW CREATE TABLE tablename;

mysql> show create table job;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                             |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| job   | CREATE TABLE `job` (
  `jid` int NOT NULL,
  `name` varchar(16) COLLATE utf8mb3_bin DEFAULT NULL,
  `id` int DEFAULT NULL,
  PRIMARY KEY (`jid`),
  KEY `id` (`id`),
  CONSTRAINT `job_ibfk_1` FOREIGN KEY (`id`) REFERENCES `person` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

FOREIGN 키 삭제 문법

: 한 테이블 내 여러개 있을 수 있으므로 constraint 같이 실행
ALTER TABLE tablename DROP FOREIGN KEY FK_constraint'

FOREIGN 키 생성문법 2

: 테이블 생성 이후에도 ALTER TABLE을 통해 FOREIGN KEY 지정 가능
ALTER TABLE tablename ADD FOREIGN KEY (column) REFERENCES REF_tablename(REF_column);

mysql> ALTER TABLE orders ADD FOREIGN KEY (id) REFERENCES person(id);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc orders;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| oid      | int         | NO   | PRI | NULL    |       |
| order_no | varchar(16) | YES  |     | NULL    |       |
| id       | int         | YES  | MUL | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
profile
데이터분석 스터디노트🧐✍️

0개의 댓글