2017년 8월 13일 일요일

MariaDB: ALTER - 칼럼(column)의 구조나 형식을 변경하기

MariaDB 10 버전이 올라가면 기능이 향상되는데, TIMESTAMP 와 DATETIME 의 데이터 타입(Data Type)을 사용하는 컬럼에 경우 Update, Insert 시에 몇가지 기능이 향상되었습니다.

Test Schema

CREATE TABLE test_date (
a INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
b INT,
created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

여기서 주목해야 할 것은 ‘created TIMESTAMP DEFAULT CURRENT_TIMESTAMP‘와 ‘updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP‘ 입니다.

Desc test_date

desc test_date;
+---------+------------------+------+-----+---------------------+-----------------------------+
| Field   | Type             | Null | Key | Default             | Extra                       |
+---------+------------------+------+-----+---------------------+-----------------------------+
| a       | int(10) unsigned | NO   | PRI | NULL                | auto_increment              |
| b       | int(11)          | YES  |     | NULL                |                             |
| created | timestamp        | NO   |     | CURRENT_TIMESTAMP   |                             |
| updated | timestamp        | NO   |     | 0000-00-00 00:00:00 | on update CURRENT_TIMESTAMP |
+---------+------------------+------+-----+---------------------+-----------------------------+
4 rows in set (0.01 sec)

Default와 Extra 컬럼에 내용을 자세히 보십시오.

여기서 Insert 를 다음과 같이 합니다.

Test 데이터 입력
root@localhost:test 16:40:38> INSERT INTO test_date SET b=1;
Query OK, 1 row affected (0.02 sec)

root@localhost:test 16:41:38> SELECT * FROM test_date;
+---+------+---------------------+---------------------+
| a | b    | created             | updated             |
+---+------+---------------------+---------------------+
| 1 |    1 | 2014-10-26 16:41:38 | 0000-00-00 00:00:00 |
+---+------+---------------------+---------------------+
1 row in set (0.00 sec)

‘created’ 컬럼에 자동으로 시간이 등록됩니다. 과거에는 다음과 같이 해줬어야 했습니다.
MariaDB 10 이하에서는 다음과 같이 해줘야..

INSERT INTO test_date SET b=1, created=now();

‘now()’ 함수를 사용해서 했어야 했지만 Mariadb 10 에서 TIMESTAMP 타입을 이용해서 컬럼을 정의하면 더 손쉽게 자동으로 처리를 해줍니다.

다음과 같이 Update 를 해봅니다.

Update 실행

mysql> UPDATE test_date SET b = b+1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM test_date;
+---+------+---------------------+---------------------+
| a | b    | created             | updated             |
+---+------+---------------------+---------------------+
| 1 |    2 | 2012-06-12 17:07:20 | 2012-06-12 17:11:48 |
+---+------+---------------------+---------------------+
1 row in set (0.00 sec)

update 필드에 값이 자동으로 시간이 업데이트 됩니다. DATETIME 도 이와 같은데 다른점은 값이 없을 경우 ‘NULL’이 됩니다.

test_date2 테이블 생성
CREATE TABLE test_date2 (
a INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
b INT,
created DATETIME DEFAULT CURRENT_TIMESTAMP,
updated DATETIME ON UPDATE CURRENT_TIMESTAMP
);


test_date2 를 만들고 다음과 같이 실행보면 값이 없을때는 NULL이 들어 갑니다.
DATETIME 의 경우 NULL

root@localhost:test 16:46:45>INSERT INTO test_date2 SET b=1;
Query OK, 1 row affected (0.02 sec)

root@localhost:test 16:47:34>select * from test_date2;
+---+------+---------------------+---------+
| a | b    | created             | updated |
+---+------+---------------------+---------+
| 1 |    1 | 2014-10-26 16:47:34 | NULL    |
+---+------+---------------------+---------+
1 row in set (0.00 sec)

root@localhost:test 16:47:42>UPDATE test_date2 SET b = b+1;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

root@localhost:test 16:48:05>select * from test_date2;
+---+------+---------------------+---------------------+
| a | b    | created             | updated             |
+---+------+---------------------+---------------------+
| 1 |    2 | 2014-10-26 16:47:34 | 2014-10-26 16:48:05 |
+---+------+---------------------+---------------------+
1 row in set (0.00 sec)

MySQL ALTER 명령을 이용한 테이블 변경

그래. 나는 초보다! 궁서체다. 진지하다

ALTER 문에 대해서 좀 끄적여 놓으려 한다.

우선 ALTER문은 이미 존재하는 테이블의 구조나 형식등을 바꾸기 위해 사용한다.

따라서, 칼럼의 구조나 형식을 변경하기 위해 ALTER명령을 사용하게 된다.

ALTER 명령어는 다음과 같다.


  1. 테이블 형식 변경

- Engine 사용 : ALTER TABLE 테이블명 ENGINE=형식;

- type 사용 : ALTER TABLE 테이블명 TYPE=형식;


  2. 테이블 이름 변경

- ALTER TABLE 테이블명 RENAME 바꿀이름

- RENAME TABLE 테이블명 TO 바꿀이름


  3. 칼럼 추가

- 마지막에 추가 : ALTER TABLE 테이블명 ADD COLUMN 칼럼이름 칼럼타입

- 지정 칼럼 뒤에 : ALTER TABLE 테이블명 ADD COLUMN 칼럼이름 칼럼타입 AFTER 칼럼이름

- 제일 앞에 : ALTER TABLE 테이블명 ADD COLUMN 칼럼이름 칼럼타입 FIRST


  4. 칼럼 삭제

- ALTER TABLE 테이블명 DROP COLUMN 칼럼이름


  5. 칼럼 변경

- ALTER TABLE 테이블명 MODIFY 컬럼이름 새컬럼타입

- ALTER TABLE 테이블명 CHANGE 컬럼이름 새컬럼이름 새컬럼타입


  6. 인덱스에 새항목 추가

- ALTER TABLE 테이블명 ADD INDEX(컬럼이름)


  7. 인덱스 삭제

- ALTER TABLE 테이블명 DROP INDEX 컬럼이름

- DROP INDEX 인덱스이름 ON 테이블명


  7. 기본키(Primary Key) 지정하기

- ALTER TABLE 테이블명 ADD PRIMARY KEY(칼럼이름) 컬럼이름

mysql> DESCRIBE test;

+-------+-------------+------+-----+---------+-------+

| Field  | Type        | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| t1      | varchar(40) |        |      |             |       |

| t2      | varchar(40) | YES  |     | NULL    |       |

| t3      | varchar(40) | YES  |     | NULL    |       |

| t4      | varchar(40) | YES  |     | NULL    |       |

+-------+-------------+------+-----+---------+-------+

4 rows in set (0.00 sec)


mysql> ALTER TABLE test ADD PRIMARY KEY(t1);

Query OK, 0 rows affected (0.00 sec)

Records: 0  Duplicates: 0  Warnings: 0


mysql> DESCRIBE test;

+-------+-------------+------+-----+---------+-------+

| Field | Type          | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| t1    | varchar(40) |         | PRI |            |       |

| t2    | varchar(40) | YES  |       | NULL    |       |

| t3    | varchar(40) | YES  |       | NULL    |       |

| t4    | varchar(40) | YES  |       | NULL    |       |

+-------+-------------+------+-----+---------+-------+

4 rows in set (0.00 sec)


  7. 기본키 삭제

- ALTER TABLE 테이블명 DROP PRIMARY KEY



출처: http://ra2kstar.tistory.com/3 [초보개발자 이야기.]

댓글 없음:

댓글 쓰기