
스프린트1
2023.11.27(월)
index.html로 해야 동작한다!GitHub Pages will look for an
index.html,index.md, orREADME.mdfile as the entry file for your site.
word에 코드 넣을 때
Alt + N&J(개체) >OpenDocument Text로 Pygments에서 꾸민 SQL 코드를 붙여넣어서 작성하면 편하다.
이번 데이터베이스 모델링 과제가 하나의 table이 다른 table을 참조하는 형태라 이와 관련된 MariaDB Key와 Data Type에 대해 가볍게 읽어보았다.
INT와 VARCHAR 말고도 table의 date field에 대해 DATETIME Type('YYYY-MM-DD hh:mm:ss' 형태)을 사용해보았다.TINYINT를 써도 될 것 같다.정수 타입(integer types)
INT[(M)] [SIGNED | UNSIGNED | ZEROFILL]SIGNED (default)UNSIGNEDZEROFILLUNSIGNED ZEROFILLZEROFILL UNSIGNED| 타입 | 저장 공간 | 최댓값 | 최솟값 | ||
|---|---|---|---|---|---|
| Signed | Unsigned | Signed | Unsigned | ||
TINYINT/INT1 | 1바이트 | -128 | 0 | 127 | 255 |
SMALLINT/INT2 | 2바이트 | -32768 | 0 | 32767 | 65535 |
MEDIUMINT/INT3 | 3바이트 | -8388608 | 0 | 8388607 | 16777215 |
INT/INT4 | 4바이트 | -2147483648 | 0 | 2147483647 | 4294967295 |
BIGINT/INT8 | 8바이트 | -9223372036854775808 | 0 | 9223372036854775807 | 18446744073709551615 |
고정 소수점 타입(fixed-point types)
DECIMAL[(M[,D])] [SIGNED | UNSIGNED | ZEROFILL]M : 소수부를 포함한 실수의 총 자릿수 ≤ 65D : 소수부 자릿수 (default 0 → 반올림) ≤ 38 (MariadB 10.2.1 이후), ≤ 30 (MariadB 10.2.1 이전)부동 소수점 타입(floating-point types)
| 타입 | 저장 공간 | 설명 |
|---|---|---|
FLOAT[(M,D)] [SIGNED \| UNSIGNED \| ZEROFILL] | 4바이트 | single-precision floating-point number는 대략 소수점 7자리까지 정확함 |
DOUBLE[(M,D)] [SIGNED \| UNSIGNED \| ZEROFILL] | 8바이트 | double-precision floating-point number 대략 소수점 15자리까지 정확함 |
비트값 타입(bit-value type)
BIT[(M)]M : 비트 길이 (1 ≤ M ≤ 64) (default 1)b'value'로 값 입력논리 자료형(boolean type)
BOOL/BOOLEAN : 0은 false, 0이 아닌 값은 true로 간주True = 1, False = 0이므로 boolean은 이 값으로 비교를 하면 안됨. 🔗1. CHAR와 VARCHAR
M : 저장할 수 있는 최대 문자열 길이
| 타입 | 범위 | 짧은 문자열 |
|---|---|---|
CHAR[(M)] | 0 ≤ M ≤ 255 (default 1) | 오른쪽을 공백으로 채워서 길이를 맞춤 PAD_CHAR_TO_FULL_LENGTH SQL 모드가 활성화되지 않은 경우 CHAR 값이 검색되면 후행 공백 제거 |
VARCHAR(M) | 0 ≤ M ≤ 65532 | 실제 입력된 문자열의 길이만큼만 저장하고 사용, 후행 공백 제거 X |
2. BINARY와 VARBINARY
CHAR과 VARCHAR과 동일하지만 이진 데이터 블록을 저장 (M 바이트)BINARY(M), VARBINARY(M)3. BLOB과 TEXT
BLOB은 Binary Large Object로 다양한 크기의 바이너리 데이터를 저장TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB으로 구분TEXT는 VARCHAR과 비슷TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT으로 구분4. ENUM
ENUM('apple','orange','pear')
| Index | Value |
|---|---|
| NULL | NULL |
| 0 | '' |
| 1 | 'apple' |
| 2 | 'orange' |
| 3 | 'pear' |
ENUM('val1','val2',...)SET('val1','val2',...)입력받은 데이터가 유효한 날짜와 시간이 아니면 모두 0을 저장
0 ≤ microseconed precision ≤ 6 (default 0)
| 타입 | 설명 |
|---|---|
DATE | 날짜 저장 : 'YYYY-MM-DD’ 형식 ‘1000-01-01' ~ '9999-12-31 |
DATETIME [(microsecond precision)] | 날짜 & 시간 저장 : 'YYYY-MM-DD HH:MM:SS.ffffff’ 형식 (default CURRENT_TIMESTAMP)’1000-01-01 00:00:00.000000’ ~ ‘9999-12-31 23:59:59.999999’ ※ SQL_MODE에 NO_ZERO_DATE가 지정되어 있지 않은 한 '0000-00-00'을 특별한 zero 날짜 값으로 지원※ 날짜의 개별 구성 요소도 SQL_MODE에 NO_ZERO_IN_DATE가 지정되어 있지 않은 한 0(ex: '2015-00-12')으로 설정※ ALLOW_INVALID_DATES SQL_MODE가 enable된 경우, 일 부분이 1 ~ 31 사이에 있으면 31일 미만인 달에도 오류 발생 X |
TIMESTAMP [(<microsecond precision)] | 날짜 & 시간 저장 : 'YYYY-MM-DD HH:MM:SS.ffffff’ 형식 ▸explicit_defaults_for_timestamp가 OFF일 때(= MariaDB 10.10까지 Default 값) 레코드가 삽입되거나 업데이트될 때 열에 값이 명시적으로 할당되지 않은 경우 또는 NULL 값이 할당된 경우 자동으로 현재 날짜 및시간으로 초기화 (단 레코드의 첫번째 TIMESTAMP에만 적용, 이후 TIMESTAMP열에는 반영 X : TIMESTAMP열이 여러 개면 첫번째에만 적용된다는 뜻) → 자동으로 DEFAULT CURRENT_TIMESTAMP와 ON UPDATE CURRENT_TIMESTAMP 속성이 할당된 것과 동일DEFAULT에 상수 값을 줘서 자동 초기화를 비활성화 가능 ▸explicit_defaults_for_timestamp가 ON일 때(= MariaDB 10.10+부터 Default 값) 다른 일반 type처럼 속성 할당해서 사용 가능 일반적으로 행이 추가되거나 업데이트된 시점을 정의하는 데 사용 '1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC |
TIME [(<microsecond precision>)] | 시간 저장 : 'HH:MM:SS.ssssss’ '-838:59:59.999999' ~ '838:59:59.999999’ |
YEAR | 4자리 연도 저장 (2자리 연도는 MariaDB 5.5.27 이후로 deprecated) 숫자와 문자열 모두 가능 1901 ~ 2155, 0000 ※ 숫자 0은 0년, 문자열 ‘0’은 2000년 반영 → 문자열을 사용하는 것이 안전할 것 같다 |
NOT NULL로 정의되어야 함AUTO_INCREMENT와 함께 많이 쓰임PRIMARY KEY ('col')로 지정하거나 속성으로 PRIMARY KEY를 넣어도 됨
CREATE TABLE `Employees` (
`ID` TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
`First_Name` VARCHAR(25) NOT NULL,
`Last_Name` VARCHAR(25) NOT NULL,
`Position` VARCHAR(25) NOT NULL,
`Home_Address` VARCHAR(50) NOT NULL,
`Home_Phone` VARCHAR(12) NOT NULL,
**PRIMARY KEY (`ID`)**
) ENGINE=Aria;
CREATE INDEX 명령어는 불가능)ALTER TABLE Employees ADD PRIMARY KEY (ID);UNIQUE KEY ('col')로 지정하거나 속성으로 UNIQUE를 넣어도 됨
CREATE TABLE `Employees` (
`ID` TINYINT(3) UNSIGNED NOT NULL,
`First_Name` VARCHAR(25) NOT NULL,
`Last_Name` VARCHAR(25) NOT NULL,
`Position` VARCHAR(25) NOT NULL,
`Home_Address` VARCHAR(50) NOT NULL,
`Home_Phone` VARCHAR(12) NOT NULL,
`Employee_Code` VARCHAR(25) NOT NULL,
PRIMARY KEY (`ID`),
**UNIQUE KEY (`Employee_Code`)**
) ENGINE=Aria;
CREATE INDEX와 ALTER TABLE 명령어 둘 다로 가능)ALTER TABLE Employees ADD UNIQUE EmpCode(Employee_Code);CREATE UNIQUE INDEX HomePhone ON Employees(Home_Phone);CREATE TABLE t1 (a INT NOT NULL, b INT, UNIQUE (a,b));
INSERT INTO t1 values (1,1), (2,2);
SELECT * FROM t1;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
| 2 | 2 |
+---+------+
INSERT INTO t1 values (2,1);
SELECT * FROM t1;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
+---+------+INSERT INTO t1 values (3,NULL), (3, NULL);
SELECT * FROM t1;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
| 3 | NULL |
| 3 | NULL |
+---+------+[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT or NO ACTION | CASCADE | SET NULL | SET DEFAULT
다른 테이블의 기본키 참조
테이블과의 관계를 설정하고 데이터 무결성(data integrity)을 강화하기 위해 사용!
외래키 열과 참조되는 열은 반드시 같은 data type이어야 함
부모와 자식 테이블은 반드시 같은 storage engine을 사용해야 함

부모 table : author
자식 table : book
CREATE TABLE author (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
) ENGINE = InnoDB;
CREATE TABLE book (
id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
author_id SMALLINT UNSIGNED NOT NULL,
CONSTRAINT `fk_book_author`
FOREIGN KEY (author_id) REFERENCES author (id)
ON DELETE CASCADE
ON UPDATE RESTRICT
) ENGINE = InnoDB;
참조하는 부모 키가 존재하지 않으면 오류 발생
INSERT INTO book (title, author_id) VALUES ('Necronomicon', 1);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
(`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`)
REFERENCES `author` (`id`) ON DELETE CASCADE)
부모 키의 행을 삭제하거나 수정할 수 없음!
UPDATE author SET id = 10 WHERE id = 1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails
(`test`.`book`, CONSTRAINT `fk_book_author` FOREIGN KEY (`author_id`)
REFERENCES `author` (`id`) ON DELETE CASCADE)
table 생성 후에 추가 (ALTER TABLE 명령어로 가능)
ALTER TABLE book ADD [CONSTRAINT fk_book_author] FOREIGN KEY (author_id) REFERENCES author (id);이 외에도 다른 KEY 종류가 있다.