스프린트1
2023.11.27(월)
index.html
로 해야 동작한다!GitHub Pages will look for an
index.html
,index.md
, orREADME.md
file 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)UNSIGNED
ZEROFILL
UNSIGNED ZEROFILL
ZEROFILL 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 종류가 있다.