코딩 공부/DataBase

[DataBase] 10_데이터베이스 관리

chocbi 2020. 5. 11. 15:18

데이터베이스 관리

#01. 데이터베이스 생성/삭제

1) 데이터베이스 생성하기

create database `데이터베이스이름` [default charset `utf8`];
  • 기존에 존재하는 데이터베이스와 동일한 이름의 데이터베이스는 생성할 수 없다.
  • 기본 캐릭터 셋은 utf8, euckr 등의 값을 지정할 수 있다.

예제

  • mytest 데이터 베이스 생성하기
mysql> create database `mytest` default charset `utf8`;
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| myschool           |
| mysql              |
| mytest             |
| performance_schema |
| sys                |
+--------------------+

2) 데이터베이스 삭제하기

drop database `데이터베이스이름`;
  • 존재하지 않는 데이터베이스의 이름을 지정한 경우 에러가 발생한다.
  • 삭제한 데이터베이스는 복구할 수 없기 때문에 신중히 수행해야 한다.

예제

  • mytest데이터베이스 삭제하기
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| myschool           |
| mysql              |
| mytest             |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

mysql> drop database `mytest`;
Query OK, 0 rows affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| myschool           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

#02. 테이블 생성하기

1) 테이블 생성 방법

CREATE TABEL `테이블이름` (
    `컬럼이름` 데이터타입 [NOT NULL | NULL] [AUTO_INCREMENT],
    `컬럼이름` 데이터타입 [NOT NULL | NULL] [AUTO_INCREMENT],
    `컬럼이름` 데이터타입 [NOT NULL | NULL] [AUTO_INCREMENT], ...
    [PRIMARY KEY (`기본키컬럼이름`)]
)    [ENGINE=InnoDB][DEFAULT CHARSET=`utf8`];
  • CREATE TABLE <테이블이름> () ENGINE=InnoDB DEFAULT CHARSET utf8;
    • 괄호 안에 테이블이 포함할 컬럼의 이름과 데잍너 타입쌍을 콤마로 구분하여 명시한다.
    • ENGINE=InnoDB –> Orcle이 MySQL을 인수한 후에 추가한 저장형식으로 참조키나 프로시저 등의 고급 기능을 사용할 수 있게 한다.
    • DEFAULT CHARSET=utf8 –> 기본 문자열 저장 형식을 UTF8로 설정

2) 테이블 생성하기

  • 데이터 타입

  • 데이터 타입을 결정한 후에는 NULL 데이터의 허용 여부를 명시한다.

    • NULL: 널 데이터 허용 함 –> 일반적으로 미필수 입력 항목에 사용한다.
    • NOT NULL: 널 데이터 허용 안함 –> 필수 입력 항목에 사용한다.
  • 기본키 (Primary Key) 지정 방법

    • 컬럼을 나열할 때 Primary Key라 명시한다.
    CREATE TABLE `test` (
        `column1` int not null primary key,
        `column2` varchar(10) not null
    ) ENGINE=InnoDB DEFAULT CHARSET=`utf8`;
  • 컬럼의 목록을 모두 나열한 후 Primary Key(‘컬럼이름’)의 형식으로 명시

    CREATE TABLE `test` (
      `column1` int not null,
      `column2` varchar(10) not null
      primary key (`column1`)
    ) ENGINE=InnoDB DEFAULT CHARSET=`utf8`;
  • 자동증가 일련번호의 설정

    • 각 데이터 행을 고유하게 구분하기 위해 설정하는 Primary Key가 int 형인 경우, AUTO_INCREMENT 옵션을 추가하면 데이터 INSERT 시에 자동으로 1식 증가된 값이 저장된다.
    CREATE TABLE `test` (
        `column1` int not null primary key auto_increment,
        `column2` varchar(10) not null
    ) ENGINE=InnoDB DEFAULT CHARSET=`utf8`;
    CREATE TABLE `test` (
        `column1` int not null auto_increment,
        `column2` varchar(10) not null
        primary key (`column1`)
    ) ENGINE=InnoDB DEFAULT CHARSET=`utf8`;
    

예제

  • id (int, PK, 자동증가), memo(varchar(255)), reg_date(datetime)의 컬럼을 갖는 테이블을 생성
mysql> CREATE TABLE mytable (
    -> id int not null primary key auto_increment,
    -> memo varchar(255) not null,
    -> reg_date datetime not null
    -> ) ENGINE=InnoDB DEFAULT CHARSET utf8;
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> DESC mytable;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| memo     | varchar(255) | NO   |     | NULL    |                |
| reg_date | datetime     | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

#03. 테이블 삭제하기

1) 테이블 삭제 구문

drop table `테이블이름`;
  • 존재하지 않는 테이블을 삭제할 경우 에러가 발생한다.
  • 삭제된 테이블은 복구 할 수 없으므로, 주의

예제

  • 앞 예제에서 생성한 mytable을 삭제하시오
mysql> drop table mytable;
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+--------------------+
| Tables_in_myschool |
+--------------------+
| department         |
| professor          |
| student            |
+--------------------+

#04. 테이블 수정하기

1) 테이블의 구조 변경하기

alter table `테이블이름` 명령어;

2) 명령어의 종류

명령어 설명
rename 테이블의 이름을 변경한다.
add 컬럼이나 제약조건을 추가한다.
change 컬럼을 수정한다.
drop 컬럼이나 제약조건을 삭제한다.

예제1

  • mytable의 이름을 mytest로 변경하기
mysql> show tables;
+--------------------+
| Tables_in_myschool |
+--------------------+
| department         |
| mytable            |
| professor          |
| student            |
+--------------------+
4 rows in set (0.00 sec)

mysql> ALTER TABLE mytable RENAME mytest;
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+--------------------+
| Tables_in_myschool |
+--------------------+
| department         |
| mytest             |
| professor          |
| student            |
+--------------------+

예제2

  • datetime 형식의 edit_date 컬럼을 Not NULL로 추가
mysql> desc mytest;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| memo     | varchar(255) | NO   |     | NULL    |                |
| reg_date | datetime     | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> ALTER TABLE mytest ADD edit_date datetime not null;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc mytest;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| memo      | varchar(255) | NO   |     | NULL    |                |
| reg_date  | datetime     | NO   |     | NULL    |                |
| edit_date | datetime     | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

예제3

  • ADD 명령어와 AFTER 옵션을 사용하여 특정 컬럼뒤에 새로운 컬럼 추가
mysql> ALTER TABLE mytest ADD writer varchar(50) NULL AFTER id;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc mytest;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| writer    | varchar(50)  | YES  |     | NULL    |                |
| memo      | varchar(255) | NO   |     | NULL    |                |
| reg_date  | datetime     | NO   |     | NULL    |                |
| edit_date | datetime     | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

예제4

  • memo 컬럼을 수정하기
    • 컬럼명 –> comment / 데이터 타입 –> text / null 허용
mysql> ALTER TABLE mytest CHANGE memo comment text Null;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc mytest;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | int(11)     | NO   | PRI | NULL    | auto_increment |
| writer    | varchar(50) | YES  |     | NULL    |                |
| comment   | text        | YES  |     | NULL    |                |
| reg_date  | datetime    | NO   |     | NULL    |                |
| edit_date | datetime    | NO   |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+

예제5

  • Writer 컬럼의 이름을 유지한 상태에서 데이터 타입만 변경하기
    • 컬럼이름과 NULL 허용 여부는 기존과 동일하게 명시하고, 변경하려는 데이터 타입만 기존의 형태와 다르게 지정한다.
mysql> ALTER TABLE mytest CHANGE writer writer varchar(100) NOT NULL;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc mytest;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| writer    | varchar(100) | NO   |     | NULL    |                |
| comment   | text         | YES  |     | NULL    |                |
| reg_date  | datetime     | NO   |     | NULL    |                |
| edit_date | datetime     | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

예제6

  • edit_date 컬럼을 삭제하기
mysql> Alter Table mytest drop edit_date;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc mytest;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| writer   | varchar(100) | NO   |     | NULL    |                |
| comment  | text         | YES  |     | NULL    |                |
| reg_date | datetime     | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

#05.참조키 설정하기

1) 테이블의 참조 관계 이해하기

  • professor 테이블에서 각 교수의 소속 학과를 의미하는 학과 번호는, department 테이블에 존재하는 학과에 대한 deptno 값이어야 한다.
  • 테이블 A의 컬럼 a에 저장 될 데이터가 반드시 테이블 B에 저장되어 있는 값 중의 하나이어야 할 경우, “테이블 A는 테이블 B를 참조한다”라고 하며, 컬럼 a를 테이블 B에 대한 참조키(혹은 외래키/Foreign Key)라고 한다.

2) 도형으로 참조 관계 표현하기

  • 테이블 A의 Primary Key를 테이블 B의 Primary Key가 참조하는 경우

    • 각 테이블에 고유하게 존재하는 값끼리 참조하므로 1:1 관계가 성립된다.

  • 테이블 A의 Primary Key를 테이블 B의 일반 컬럼이 참조하는 경우

    • 하나의 A를 하나 이상의 B가 참조하는 1:n의 관계가 성립된다.

3) 참조키 설정하기

CREATE TABLE `테이블이름` (
    `컬럼이름` 데이터타입 [NOT NULL | NULL] [AUTO_INCREMENT],
    `컬럼이름` 데이터타입 [NOT NULL | NULL] [AUTO_INCREMENT], ... 
[, PRIMARY KEY (`기본키컬럼이름`)]
[, FOREIGN KEY (`참조키컬럼이름`)
    REFERENCES `대상테이블명` (`대상테이블의 컬럼명`) ]
) ENGINE=InnoDB DEFAULT CHARSET=`utf8`;
  • 참조키 설정시 다음의 제약조건이 생성된다.
    • 다른 테이블의 참조를 받고 잇는 데이터는 참조하고 있는 데이터가 삭제 되기 전까지는 먼저 삭제될 수 없다.
    • 다른 테이블의 데이터를 참조하는 컬럼은 해당 컬럼의 데이터 중 하나를 저장해야만 한다.

예제

  • 학생 케이블의 studno 컬럼을 참조하는 성적 테이블 만들기
mysql> CREATE TABLE grade (
    -> id int not null auto_increment,
    -> studno int not null,
    -> subject varchar(100) not null,
    -> point int not null,
    -> reg_date datetime not null,
    -> PRIMARY KEY (id),
    -> FOREIGN KEY (studno) REFERENCES student (studno)
    -> ) ENGINE=InnoDB DEFAULT CHARSET utf8;
Query OK, 0 rows affected, 1 warning (0.04 sec)
  • 예제 결과 확인 - 참조키는 테이블 구조에서 “MUL”로 표시된다.
mysql> desc grade;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| studno   | int(11)      | NO   | MUL | NULL    |                |
| subject  | varchar(100) | NO   |     | NULL    |                |
| point    | int(11)      | NO   |     | NULL    |                |
| reg_date | datetime     | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

4) 참조 관계에서 INSERT의 제약조건 확인하기

  • grade 테이블의 studno 컬럼은 student 테이블의 studno를 참조하기 때문에 student 테이블에 저장되어 있지 않은 값은 INSERT 할 수 없다.
  • student 테이블에 저장되지 않은 값을 사용한 INSERT의 예
mysql> INSERT INTO grade (studno, subject, point, reg_date) values  (1234, '데이터베이스', 98, now());
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`myschool`.`grade`, CONSTRAINT `grade_ibfk_1` FOREIGN KEY (`studno`) REFERENCES `student` (`studno`))
mysql>
  • student 테이블에 저장되어 있는 값을 사용한 INSERT의 예
mysql> INSERT INTO grade (studno, subject, point, reg_date) values  (10101, '데이터베이스', 98, now());
Query OK, 1 row affected (0.01 sec)

5) 참조 관계에서 DELETE의 제약조건

  • 다른 테이블의 참조를 받고 있는 데이터는 자신을 참조하는 대상이 삭제되기 전에는 먼저 삭제될 수 없다.
  • 10101번을 참조 하는 grade 데이터가 있는 경우
mysql> delete from student where studno=10101;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`myschool`.`grade`, CONSTRAINT `grade_ibfk_1` FOREIGN KEY (`studno`) REFERENCES `student` (`studno`))
  • grade의 데이터를 먼저 삭제해야만 student를 삭제할 수 있다.
Query OK, 1 row affected (0.01 sec)

mysql> delete from student where studno=10101;
Query OK, 1 row affected (0.01 sec)

#06. 데이터베이스 백업/복구

1) 데이터베이스 백업/복구

  • MySQL의 백업과 복구는 명령프롬프트에서 MySQL의 실행파일이 위치하는 경로로 이동한 후에 수행해야 한다.
  • 백업하기
mysql -u계정아이디 -p 백업할DB이름 > 백업파일경로
  • 데이터베이스 백업하기

    • myschool 데이터베이스를 “저장을 원하는 폴더\myschool-backup.sql”
    mysqldump -uroot -p myschool > 저장을 원하는 폴더\myschool-backup.sql
    
    - C 드라이브 안에 backup 디렉토리를 미리 생성해 두어야한다.
  • 이 명령어는 MySQL 접속 상태가 아닌 일반 명령프롬프트 상태에서 실행해야 한다.
    • 백업후, 지정된 경로에 파일이 생성되었는지 확인하도록 한다.
  • 복구하기
mysql -u계정아이디 -p 복구할DB이름 < 백업파일경로
  • 데이터베이스 복구하기

    • 백업한 저장을 원하는 폴더\myschool-backup.sql 파일을 사용하여 rollback_test에 백업한 파일의 내용을 복구하기

      • MySQL 접속 상태가 아닌 윈도우 명령프롬프트 상태에서 수행한다.
      mysql -uroot -p rollback_test < 저장을 원하는 폴더\myschool-backup.sql
      
  • 복구 결과 확인하기

    • MySQL에 접속하여 복구된 데이터베이스를 확인한다.