language:php:php와mysql-ch78-db-mysql
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
다음 판 | 이전 판 | ||
language:php:php와mysql-ch78-db-mysql [2013/05/24 12:19] – 새로 만듦 kieuns | language:php:php와mysql-ch78-db-mysql [2024/04/23 22:44] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | {{page> | ||
+ | ====== 웹 DB 디자인 ====== | ||
+ | |||
+ | * PrimaryKey : 한 테이블에서 각 데이터를 구분하는 식별자 역할을 하는 열. key 또는 PrimaryKey라고 한다. | ||
+ | * ForeignKey : PrimaryKey가 다른 테이블에서 사용되는 경우, ForeignKey가 된다. | ||
+ | * 웹DB디자인시 유의사항 | ||
+ | * Table에 중복 data를 두지 말자. | ||
+ | * 하나의 항목에는 하나의 데이터만 | ||
+ | * 사용할 쿼리를 생각하면서 작성 | ||
+ | * 빈내용이 많지 않게 작성 | ||
+ | |||
+ | 그외 건질게 없다. | ||
+ | |||
+ | ====== 웹 DB 만들기 ====== | ||
+ | |||
+ | * 문장 끝은 ';' | ||
+ | * mysql 서버 접속 <code bash> | ||
+ | * -h [hostname] : [hostname] 부분에 서버 아이피나 이름을 넣는다. | ||
+ | * -u [username] : [username] 옵션을 적지 않으면 현재 로그인한 유저 아이디로 로그인한다. | ||
+ | * -p 암호. 적는 부분이 아니고, -p를 입력하면 암호 입력 화면이 다시 보인다. | ||
+ | * [press enter key] : 진짜로 엔터키를 입력하라고 적었다. | ||
+ | |||
+ | ===== DB 만들기 ===== | ||
+ | |||
+ | <code sql> | ||
+ | create database DATABASENAME; | ||
+ | </ | ||
+ | |||
+ | DATABASENAME는 새로운 DB이름을 넣는다. | ||
+ | |||
+ | 이렇게 해도 되지만, 인코딩 방식과 DB 타입을 적어주지 않으면 이상하게 생성될 수 있으니 주의. | ||
+ | |||
+ | ===== 사용자 권한 : GRANT ===== | ||
+ | |||
+ | 사용자의 권한을 4단계에 맞춰 설정하는 명령어. | ||
+ | |||
+ | - Global | ||
+ | - Database | ||
+ | - Table | ||
+ | - Column | ||
+ | |||
+ | grant의 일반적인 형식을 보면, | ||
+ | <code sql> | ||
+ | GRANT privileges [columns] | ||
+ | ON item | ||
+ | TO user_name [IDENTIFIED BY ' | ||
+ | [REQUIRE ssl_options] | ||
+ | [WITH [GRANT OPTION | limit_option] ] | ||
+ | </ | ||
+ | |||
+ | '[ ]'에 있는 것은 옵션. | ||
+ | |||
+ | * privileges : 허용할 권한을 적는다. 한개 이상이면 ',' | ||
+ | * [columns] : 옵션이고, | ||
+ | * item : 권한이 적용될, DB나 테이블 이름을 넣어준다. 모두 적용하려면 *.* 라고 입력한다. | ||
+ | * DBName.* : 특정 db에 모든 테이블 | ||
+ | * DBName.DBTable : 특정 db, 특정 테이블 | ||
+ | * user_name : mysql에 접속할 사용자의 이름. 사용자 이름은 호스트 이름까지 포함한다. ( xyz@localhost, | ||
+ | * ' | ||
+ | * REQUIRE : SSL을 통해서만 접속할 수 있다고 정하는데 사용한다. | ||
+ | * WITH [GRANT OPTION] : 권한 이외의 다른 옵션을 설정하는데 사용한다. | ||
+ | * MAX_QUERIES_PER_HOUR (n) : 시간당 쿼리 제한 | ||
+ | * MAX_UPDATES_PER_HOUR (n) : 시간당 업데이트 제한 | ||
+ | * MAX_CONNECTIONS_PER_HOUR (n) : 시간당 접속 수 제한 | ||
+ | |||
+ | 권한은 mysql.user, mysql.db, mysql.tables_priv, | ||
+ | |||
+ | ===== 권한의 종류와 레벨 ===== | ||
+ | |||
+ | ^ 명령어 | ||
+ | | SELECT | table,col | 선택만 | | ||
+ | | INSERT | table,col | 추가만 | | ||
+ | | UPDATE | table,col | 갱신만 | | ||
+ | | DELETE | table | 테이블 행 삭제 | | ||
+ | | INDEX | table | 인덱스 추가나 삭제 | | ||
+ | | ALTER | table | 테이블 구조 변경 - 열 추가, 열이나 테이블 이름 변경, 열의 데이터 형 변경 | | ||
+ | | CREATE | table | | | ||
+ | | DROP | table | 테이블 삭제 | | ||
+ | |||
+ | 관리자 권한 | ||
+ | |||
+ | | CREATE TEMPORARY TABLES | CREATE TABLES문에 TEMPORARY을 사용할 수 있게 허가...가 무슨 뜻일까? | | ||
+ | | FILE | 파일의 데이터가 읽혀지는 것을 가능하게. ( 그 반대도 ) | | ||
+ | | LOCK TABLES | LOCK TABLES 를 직접 사용할 수 있게 | | ||
+ | | PROCESS | 관리자가 사용자에게 속한 서버에서 실행되는 프로세스들에 대해서 볼 수 있게 한다. (?) | | ||
+ | | RELOAD | grant를 테이블을 다시 읽어들여 권한, | ||
+ | | REPLICATION CLIENT | 복사 마스터와 슬레이브에 대해 show status를 할 수 있다. | | ||
+ | | REPLICATION SLAVE | 복사 슬레이브 서버가 마스터 서버에 접속 할 수 있게 한다. | | ||
+ | | SHOW DATABASES | 모든 db 이름을 볼 수 있다. 이것도 권한이 필요한 거로군 | | ||
+ | | SHUTDOWN | 정지 가능 | | ||
+ | | SUPER | 관리자가 사용자에 속한 스레드를 종료할 수 있다. (?) | | ||
+ | |||
+ | 특별한 권한 | ||
+ | |||
+ | | ALL | 모든 권한. ALL PRIVILEGES | | ||
+ | | USAGE | NO 권한 | | ||
+ | |||
+ | ===== revoke 명령어 ===== | ||
+ | |||
+ | 사용자로부터 권한을 뺏을때 사용한다. | ||
+ | |||
+ | ===== grant와 revoke의 예제 ===== | ||
+ | |||
+ | fred에게 모든 DB 권한 허용. | ||
+ | <code sql> | ||
+ | grant all on * | ||
+ | to fred identified by ' | ||
+ | with grant option; | ||
+ | </ | ||
+ | |||
+ | 권한 취소 | ||
+ | <code sql> | ||
+ | revoke all privileges, grant, from fred; | ||
+ | </ | ||
+ | |||
+ | 권한 없는 일반 사용자 | ||
+ | <code sql> | ||
+ | grant usage on books.* to sally identified by ' | ||
+ | </ | ||
+ | |||
+ | abc에게 필요한 권한 부여 | ||
+ | <code sql> | ||
+ | grant select, insert, update, delete, index, alter, create, drop on books.* to abc; | ||
+ | </ | ||
+ | |||
+ | abc에게서 일부 삭제 | ||
+ | <code sql> | ||
+ | revoke alter, create, drop on books.* from abc; | ||
+ | </ | ||
+ | |||
+ | ===== 웹을 위한 사용자 설정 ===== | ||
+ | |||
+ | select, insert, delete, update 네가지면 기본은 충분하다, | ||
+ | |||
+ | <code sql> | ||
+ | grant select, insert, delete, update on SomeDB.* to {id} identified by ' | ||
+ | </ | ||
+ | |||
+ | 모두 하고 싶다면, | ||
+ | |||
+ | <code sql> | ||
+ | grant select, insert, update, delete, index, alter, create, drop | ||
+ | on SomeDB.* | ||
+ | to {id} identified by ' | ||
+ | </ | ||
+ | |||
+ | ====== DB Table 만들기 ====== | ||
+ | |||
+ | 기본 구문 | ||
+ | |||
+ | <code sql> | ||
+ | CREATE TABLE {tablename}( {columns} ) | ||
+ | </ | ||
+ | |||
+ | 별도 sql 파일로 생성 스크립트가 있다면 | ||
+ | |||
+ | <code sql> | ||
+ | mysql -h {host} -u {userId} -D {dbname} -p < {fileName}.sql | ||
+ | </ | ||
+ | |||
+ | {filename}.sql -> 샘플로 입력 | ||
+ | |||
+ | <code sql> | ||
+ | -- 샘플로 입력하는 스크립트, | ||
+ | create table customers ( | ||
+ | customerid int unsigned not null auto_increment primary key, | ||
+ | name char(50) not null, | ||
+ | address char(100) not null, | ||
+ | city char(30) not null | ||
+ | ); | ||
+ | create table xxyy ( -- 다른 컬럼들 추가 | ||
+ | quantity tinyint unsigned, | ||
+ | -- ... | ||
+ | amount float(6,2), | ||
+ | date date not null, | ||
+ | -- ... | ||
+ | primary key( orderid, isbn ), | ||
+ | -- ... | ||
+ | review text | ||
+ | ); | ||
+ | </ | ||
+ | |||
+ | 생성하는 컬럼을 적어준다... 너무 당연한가. | ||
+ | |||
+ | ===== 키워드의 의미 ===== | ||
+ | |||
+ | **NOT NULL** : 반드시 값이 있어야한다. | ||
+ | |||
+ | **AUTO_INCREMENT** : 한 행의 데이터를 입력한다면, | ||
+ | |||
+ | **PRIMARY KEY** : 이 열이 테이블의 기본 키라는 뜻. | ||
+ | |||
+ | **integer** : 정수 데이터 형 뒤에 붙는 **unsigned**는 데이터가 0 이상의 양수여야 한다는 뜻. | ||
+ | |||
+ | CHAR은 고정 버퍼, VARCHAR는 사용한 만큼만 공간할당, | ||
+ | |||
+ | ===== db 살펴보기 ===== | ||
+ | |||
+ | <code sql> | ||
+ | show tables; -- 테이블의 목록을 보여준다. | ||
+ | show databases; | ||
+ | describe {table}; -- 테이블 컬럼을 보여준다. | ||
+ | </ | ||
+ | |||
+ | ===== 인덱스 만들기 ===== | ||
+ | |||
+ | 기본 키는 인덱스를 생성한다. | ||
+ | |||
+ | 기본 키가 아닌 다른 열에 인덱스를 추가할 수 있다. | ||
+ | |||
+ | <code sql> | ||
+ | CREATE [UNIQUE|FULLTEXT] INDEX index_name | ||
+ | ON table_name (index_column_name [(length) [ASC|DESC], | ||
+ | </ | ||
+ | |||
+ | length 옵션을 사용해서 일정 자리수 만큼 인덱스로 사용할 수 있다. | ||
+ | |||
+ | ====== MySQL 식별자 ====== | ||
+ | |||
+ | 패스 | ||
+ | |||
+ | ====== 열의 데이터 형(type) ====== | ||
+ | |||
+ | 옵션은 [,] 사이에 넣는다. | ||
+ | ()안의 m은 크기에 해당하는 숫자를 입력. | ||
+ | |||
+ | ===== 숫자 ===== | ||
+ | |||
+ | * unsigned : 추가해서 양수로 설정 가능. | ||
+ | * zerofill : 데이터를 화면에 출력할때, | ||
+ | |||
+ | ==== 정수 ==== | ||
+ | |||
+ | ^ 타입 ^ 범위 ^ 저장공간(바이트) ^ 설명 ^ | ||
+ | | TINYINT[(m)] | ||
+ | | BIT | | | tinyint 와 같다 | | ||
+ | | BOOL | | | tinyint 와 같다 | | ||
+ | | SMALLINT[(m)] | ||
+ | | MEDIUMINT[(m)] | -8388608 ~ 8388607 / 0 ~ 16777215 | 3 | 보통크기 | | ||
+ | | INT[(m)] | ||
+ | | INTEGER[(m)] | ||
+ | | BIGINT[(m)] | ||
+ | |||
+ | ==== 부동소수의 표기 ==== | ||
+ | |||
+ | 참고 : | ||
+ | * E를 사용하는 표기법에서는 소수점(.)을 E 다음 나오는 숫자만큼 앞,뒤로 이동시킨다. | ||
+ | * 123456789.1234567 --> 1.234567891234567e+8 | ||
+ | * 0.00000000000000000001 --> 1e-20 | ||
+ | |||
+ | ^ 타입 ^ 범위 ^ 저장공간(바이트) ^ 설명 ^ | ||
+ | | FLOAT(precision) | precision 값에 따라 다르다 | 다양 | 32비트, | ||
+ | | FLOAT[(m, | ||
+ | | DOUBLE[(m, | ||
+ | | DOUBLE \\ PRECISION[(m, | ||
+ | | REAL[(m,d)] | 위와 같다 | | double[(m, | ||
+ | | DECIMAL[(m[, | ||
+ | | NUMERIC[(m, | ||
+ | | DEC[(m,d)] | 위와 같음 | | DECIMAL과 같다 | | ||
+ | | FIXED[(m, | ||
+ | ====== 날짜, | ||
+ | |||
+ | ^ type ^ 범위 ^ 설명 ^ | ||
+ | | DATE | 1000-01-01 / 9999-12-31 | YYYY-MM-DD 형식의 날짜 | | ||
+ | | TIME | -838:59:59 / 838:59:59 | HH:MM:SS 형식으로 표기 \\ 시간값이 실생활보다 값의 범위가 크단다 | | ||
+ | | DATETIME | 1000-01-01 00:00:00 / 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS 형식 | | ||
+ | | TIMESTAMP[(m)] | 1970-01-01 00:00:00 | 타임스탬프. 데이터의 최종 변경 시각을 저장하는데 유용. \\ m 값에 따라 표기 형식이 달라진다. 한계값은 2037 | | ||
+ | | YEAR[(2< | ||
+ | |||
+ | ===== 타임스탬프 ===== | ||
+ | |||
+ | ^ 종류 ^ 표기 형식 ^ | ||
+ | | TIMESTAMP | ||
+ | | TIMESTAMP(14) | YYYYMMDDHHMMSS | | ||
+ | | TIMESTAMP(12) | YYMMDDHHMMSS | | ||
+ | | TIMESTAMP(10) | YYMMDDHHMM | | ||
+ | | TIMESTAMP(8) | ||
+ | | TIMESTAMP(6) | ||
+ | | TIMESTAMP(4) | ||
+ | | TIMESTAMP(2) | ||
+ | |||
+ | * char(고정된 길이의 문자) : 데이터 길이가 고정길이보다 작다면 특별한 문자(? | ||
+ | * varchar(가변 길이의 문자) : 길이만큼만 유지된다. | ||
+ | * TEXT : 긴 길이의(? 어느정도의 길이?) 문장 저장 | ||
+ | * BLOB : 이진데이터를 저장. 이미지, | ||
+ | * SET : 여기에 들어가는 데이터는 미리 정의한 집합 안의 원소들로만 되어야(넣을 수 있다가 아니고) 한다. 집합에는 원소가 64개 가능. | ||
+ | * ENUM : 미리 정의된 집합 안의 원소에 있는 값만 데이터로 저장. 집합에는 65535까지 가능. | ||
+ | |||
+ | ^ 연산자 ^ 사용법 ^ 동일식 ^ | ||
+ | | [NATIONAL] \\ CHAR(m) \\ [BINARY < | ||
+ | | CHAR | | CHAR(1)과 같다 | | ||
+ | | [NATIONAL] \\ VARCHAR(m) \\ [BINARY] | 1~255문자 | 가변 길이 지원 외, char과 같다 | | ||
+ | |||
+ | text, blob | ||
+ | |||
+ | 사이즈가 용도를 결정해준다. | ||
+ | |||
+ | ^ type ^ size ^ 설명 ^ | ||
+ | | TINYBLOB | 2< | ||
+ | | TINYTEXT | 2< | ||
+ | | BLOB | 2< | ||
+ | | TEXT | 2< | ||
+ | | MEDIUMBLOB | 2< | ||
+ | | MEDIUMTEXT | 2< | ||
+ | | LONGBLOB | 2< | ||
+ | | LONGTEXT | 2< | ||
+ | |||
+ | enum, set | ||
+ | |||
+ | ^ type ^ 집합에 들어갈 수 있는 최대 개수 ^ 설명 ^ | ||
+ | | ENUM( ' | ||
+ | | SET( ' |