본문 바로가기
PHP/DB

[DB]테이블 및 칼럼(필드) 생성 시 고려할 사항

by 개발하자구 2023. 2. 15.

< 테이블 타입 >

현재는 InnoDB 가 많이 쓰인다.

과거에는 Myisam 가 많이 쓰였음

 

 

< Auto Increment Value 기능>

번호를 자동으로 생성하는 기능.(Oracle의 시퀀스와 같다.)

'다음에 적을 번호를 나타냄'

 

ex) 만약 ' Auto Increment Value = 2 ' 라면. 현재 1번에  DB가 들어 있다는 뜻

 

DB의 마지막 숫자+1

 

ex) 1~9까지가 비어있고, DB에 '10' 이라는 결과물이 존재한다면 Auto Increment Value가 '11'이 되어야 한다.

 

  • Auto Increment 값을 수동으로 수정하는 방법

Auto Increment 값을 수정하는 방법

 

 

< 필드 생성 시 사용하는 blob(블랍) 타입 >

이미지나 파일 같은 것들을 DB에 저장하려고 할 때 사용하는 타입

 

 

< 필드 생성 시  숫자와 문자타입>

숫자타입은 length를 따로 설정하지 않아도 자동으로 채워짐 (int는 '11'이 자동으로 채워지고, double, float 등..은  '0'으로 두면 된다.)

글자타입은 length를 직접줘야한다. (모르겠으면 '255'로 준다)

 

 

  • null 과 empty 를 구분하자.

null -> 공간은 있지만 값이 없다.

empty -> 값이 있지만 비어있다.

 

ex) String value ;  -> null

ex) String value =" "; -> empty

 

null + null = null (인식못해 오류가 날 수 있음)

empty + empty = empty (오류안남)

 

문자열의 Default 값은 -> empty를 직접 입력해줘야함.  (Default값을 안주면 null로 설정 되어버리기 때문)

숫자의 Default 값은 -> 0 을 직접 입력해줘야함. 

 

tip)

글자 length를 어느정도로 지정해줄지 모를때는 일반적으로 255를 주면된다.

 

문자와 글자 Navicat for Mysql 예시 1
문자와 글자 Navicat for Mysql 예시 2

 

 

< 필드 생성 시  날짜타입>

 

date, datetime -> Default 값을 null로 준다. 날짜는 empty가 안 됨.  (0000-00-00 또는 1900-01-01 으로도 줌)

                            length는 '0'으로 주면 됨. 

                           일반적으로 allow null 허용함

 

 

  • 생성일과 수정일을 구분하자.

 

생성일과 수정일은 보통 타입을 timestamp로 준다. 이렇게 설정할 시 생성일과 수정일을 구분을 해야하는데,

 

생성일은 Default값을 CURRENT_TIMESTAMP라고 입력해줘야하고 On Update CURRENT_TIMESTAMP란에는 체크해제.

수정일은 Default값을 Null로 설정하고 On Update CURRENT_TIMESTAMP란에 체크를 해줘야 함.

 

필드 생성 시 날짜타입 예시 1

 

 

필드 생성 시 날짜타입 예시 2

 

 

 

 

< index(indexes) 지정하기>

 

index는 검색 속도를 높이기 위한 색인 기술로 테이블마다 자주 검색되는 컬럼을 선택해  꼭 index를 지정해줘야한다.

index지정시 주의 사항은 특정 숫자(금액, count 등)와 같이 직접 검색어로 입력하기 힘든 필드는 index로 지정안하는것이 좋다. 특히 숫자류..

 

index지정하기 예시

 

 

 

 

참고사항

 

 

< 실제로 생성한 4개의 테이블 Dump SQL FILE 로 export >

  • zproduct 테이블
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `zproduct`
-- ----------------------------
DROP TABLE IF EXISTS `zproduct`;
CREATE TABLE `zproduct` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pname` varchar(255) DEFAULT '' COMMENT '제품명',
  `psize` varchar(255) DEFAULT '' COMMENT '규격',
  `barcode` varchar(30) DEFAULT '' COMMENT '바코드',
  `location` varchar(255) DEFAULT '' COMMENT '위치',
  `price` double DEFAULT '0' COMMENT '단가',
  `dtcreate` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일',
  `dtedit` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일',
  PRIMARY KEY (`id`),
  KEY `idx_pname` (`pname`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='제품관리';

-- ----------------------------
-- Records of zproduct
-- ----------------------------
INSERT INTO `zproduct` VALUES ('1', 'cpu', '300cm', '1234567890123', 'TA-0123', '100000', '2023-02-14 17:34:47', '2023-02-15 09:41:08');
INSERT INTO `zproduct` VALUES ('2', '키보드', '30cm', '1234567890124', 'TA-0123', '150000', '2023-02-14 17:34:49', '2023-02-15 09:41:14');
INSERT INTO `zproduct` VALUES ('3', 'ram', '10cm', '1234567890125', 'TA-3456', '20000', '2023-02-14 17:34:58', '2023-02-15 09:41:16');
INSERT INTO `zproduct` VALUES ('4', '메인보드', '20cm', '1234567890126', 'TA-3456', '400000', '2023-02-14 17:35:01', '2023-02-15 09:41:17');
INSERT INTO `zproduct` VALUES ('5', 'hdd', '15cm', '1234567890127', 'TA-3456', '200000', '2023-02-14 17:35:05', '2023-02-15 09:41:19');
  • zpan 테이블
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `zpan`
-- ----------------------------
DROP TABLE IF EXISTS `zpan`;
CREATE TABLE `zpan` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `indate` date DEFAULT NULL COMMENT '날짜',
  `type` varchar(20) DEFAULT '' COMMENT '구분 (매입,매출)',
  `cid` int(11) DEFAULT '0' COMMENT '거래처ID (zcompany.id)',
  `pid` int(11) DEFAULT '0' COMMENT '제품ID (zprocudt.id)',
  `cnt` double DEFAULT '0' COMMENT '수량',
  `price` double DEFAULT '0' COMMENT '단가',
  `total` double DEFAULT '0' COMMENT '합계',
  `dtcreate` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일',
  `dtedit` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일',
  PRIMARY KEY (`id`),
  KEY `idx_indate` (`indate`),
  KEY `idx_type` (`type`),
  KEY `idx_cid` (`cid`),
  KEY `idx_pid` (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='판매관리';

-- ----------------------------
-- Records of zpan
-- ----------------------------
INSERT INTO `zpan` VALUES ('1', '2023-02-14', '매출', '3', '2', '20', '150000', '3000000', '2023-02-14 15:45:36', '2023-02-15 09:04:58');
INSERT INTO `zpan` VALUES ('2', '2023-01-01', '매출', '3', '1', '1', '100000', '100000', '2023-02-14 17:36:25', '2023-02-15 09:05:29');
INSERT INTO `zpan` VALUES ('3', '2022-01-01', '매입', '2', '3', '2', '20000', '40000', '2023-02-14 17:36:27', '2023-02-15 09:08:43');
INSERT INTO `zpan` VALUES ('4', '2021-11-23', '매출', '4', '5', '10', '200000', '2000000', '2023-02-14 17:36:28', '2023-02-15 09:06:45');
INSERT INTO `zpan` VALUES ('5', '2020-07-25', '매입', '5', '1', '4', '100000', '400000', '2023-02-14 17:36:30', '2023-02-15 09:08:03');
INSERT INTO `zpan` VALUES ('6', '2011-01-03', '매출', '2', '1', '2', '100000', '200000', '2023-02-14 17:36:32', '2023-02-15 09:09:52');
INSERT INTO `zpan` VALUES ('7', '2001-06-18', '매입', '3', '3', '5', '20000', '100000', '2023-02-14 17:36:34', '2023-02-15 09:22:37');
INSERT INTO `zpan` VALUES ('8', '2015-03-22', '매출', '4', '4', '3', '400000', '1200000', '2023-02-14 17:36:35', '2023-02-15 09:10:24');
INSERT INTO `zpan` VALUES ('9', '2017-04-22', '매입', '1', '1', '4', '100000', '400000', '2023-02-14 17:36:37', '2023-02-15 09:10:30');
INSERT INTO `zpan` VALUES ('10', '2009-01-31', '매출', '5', '3', '5', '20000', '100000', '2023-02-14 17:36:42', '2023-02-15 09:10:36');
  • zmoney 테이블
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `zmoney`
-- ----------------------------
DROP TABLE IF EXISTS `zmoney`;
CREATE TABLE `zmoney` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `indate` date DEFAULT NULL COMMENT '날짜',
  `type` varchar(20) DEFAULT '' COMMENT '구분 (입금,지급)',
  `cid` int(11) DEFAULT '0' COMMENT '거래처ID (zcompany.id)',
  `method` varchar(20) DEFAULT '' COMMENT '결제방법 (현금,카드,통장,기타)',
  `money` double DEFAULT '0' COMMENT '금액',
  `dtcreate
dtcreate` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일',
  `dtedit` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일',
  PRIMARY KEY (`id`),
  KEY `idx_indate` (`indate`),
  KEY `idx_type` (`type`),
  KEY `idx_cid` (`cid`),
  KEY `idx_method` (`method`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='자금관리';

-- ----------------------------
-- Records of zmoney
-- ----------------------------
INSERT INTO `zmoney` VALUES ('1', '2022-01-01', '입금', '3', '카드', '3000000', '2023-02-15 09:11:58', '2023-02-15 09:18:29');
INSERT INTO `zmoney` VALUES ('2', '2021-04-05', '입금', '3', '카드', '100000', '2023-02-15 09:12:14', '2023-02-15 09:19:00');
INSERT INTO `zmoney` VALUES ('3', '2021-07-06', '출금', '2', '카드', '40000', '2023-02-15 09:12:18', '2023-02-15 09:19:04');
INSERT INTO `zmoney` VALUES ('4', '2021-08-09', '입금', '4', '기타', '2000000', '2023-02-15 09:12:26', '2023-02-15 09:19:10');
INSERT INTO `zmoney` VALUES ('5', '2021-03-14', '출금', '5', '현금', '400000', '2023-02-15 09:12:26', '2023-02-15 09:19:13');
INSERT INTO `zmoney` VALUES ('6', '2021-06-30', '입금', '2', '카드', '200000', '2023-02-15 09:12:35', '2023-02-15 09:19:15');
INSERT INTO `zmoney` VALUES ('7', '2022-01-31', '출금', '3', '현금', '100000', '2023-02-15 09:12:39', '2023-02-15 09:23:12');
INSERT INTO `zmoney` VALUES ('8', '2021-01-05', '입금', '4', '카드', '1200000', '2023-02-15 09:12:47', '2023-02-15 09:19:23');
INSERT INTO `zmoney` VALUES ('9', '2021-03-11', '출금', '1', '카드', '400000', '2023-02-15 09:12:50', '2023-02-15 09:19:26');
INSERT INTO `zmoney` VALUES ('10', '2021-02-22', '입금', '5', '현금', '100000', '2023-02-15 09:12:54', '2023-02-15 09:19:28');
  • zcompany 테이블
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `zcompany`
-- ----------------------------
DROP TABLE IF EXISTS `zcompany`;
CREATE TABLE `zcompany` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(255) DEFAULT '' COMMENT '거래처명',
  `cnumber` varchar(12) DEFAULT '' COMMENT '사업자번호',
  `ceo` varchar(255) DEFAULT '' COMMENT '대표자',
  `address` varchar(255) DEFAULT '' COMMENT '위치',
  `tel` varchar(255) DEFAULT '' COMMENT '전화',
  `hp` varchar(255) DEFAULT '' COMMENT '핸드폰',
  `smoney` double DEFAULT '0' COMMENT '기초잔액',
  `tmoney` double DEFAULT '0' COMMENT '거래잔액',
  `dtstart` date DEFAULT NULL COMMENT '사업시작일',
  `dtend` date DEFAULT NULL COMMENT '사업종료일',
  `dtcreate` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일',
  `dtedit` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일',
  PRIMARY KEY (`id`),
  KEY `idx_cname` (`cname`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT='거래처관리';

-- ----------------------------
-- Records of zcompany
-- ----------------------------
INSERT INTO `zcompany` VALUES ('1', 'LG전자', '123-68-45895', '구창모', '서울 종로구 평창동 109-1', '02-394-2340', '010-2349-3949', '10000000', '0', '2000-01-14', null, '2023-02-14 15:43:47', '2023-02-15 09:40:19');
INSERT INTO `zcompany` VALUES ('2', '삼성전자', '123-86-12452', '이재용', '서울 노원구 평창동 57-1', '02-396-0239', '010-2302-2302', '103000000', '0', '2003-02-11', null, '2023-02-14 15:43:51', '2023-02-15 09:40:19');
INSERT INTO `zcompany` VALUES ('3', 'ASUS', '526-12-56235', '맥아더', '서울 강남 개포동', '02-391-7484', '010-2321-2355', '122200000', '0', '2003-01-11', null, '2023-02-14 15:43:53', '2023-02-15 09:40:20');
INSERT INTO `zcompany` VALUES ('4', 'MSI', '856-84-25631', '야마구치', '광주', '062-442-2402', '010-2426-6565', '100000000', '0', '1999-02-14', null, '2023-02-14 17:31:22', '2023-02-15 09:40:20');
INSERT INTO `zcompany` VALUES ('5', 'Apple', '485-86-23561', '안형수', '대구', '036-454-34-444', '010-2302-2302', '1000000000', '0', '2001-09-01', null, '2023-02-14 17:33:09', '2023-02-15 09:40:20');
INSERT INTO `zcompany` VALUES ('11', '재민전자', '123-45-12345', '정재민', '광주광역시', '062-123-1234', '010-1234-1234', '0', '0', '0000-00-00', null, '2023-02-15 09:35:49', '2023-02-15 09:37:20');