|
1. SQL서버의 테이블에 대한 이해 | |
이번에 소개해 드릴 내용은 테이블 입니다. ^_^ 여태까지 SQL서버의 테이블을 계속 언급 했구요.. 샘플 테스트를 위해 몇번 CREATE TABLE 이라는 구문을 이용해 샘플을 만들어 댔던걸 기억 하실 겁니다. 이제 이 테이블에 대해 좀더 공부를 해 보도록 하지요. 사실 이 부분은 다시 상기시켜 드리기 위한 소개 페이지 정도라고 생각하시는게 더 편하실 거에요. ^_^
이 그림 기억이 나시는지요? ^_^ 바로 이전까지 SQLER님들은 데이터베이스에 대해 공부를 하신 겁니다. 이젠 데이터베이스내에 있는 여러 객체들중 테이블 입니다.
테이블은 실제로 데이터가 저장되는 저장소입니다. ^_^ 역시나 복습차원에서 다시 살짝 말을 드리면? ^_^ 데이터베이스를 생성하면? 이 데이터베이 정보는 master database에 저장이 되게 됩니다.
이어서 테이블은 데이터베이스에 속하는 객체 입니다. 이 테이블은 어디에 저장이 될까요? 바로 모든 데이터베이스마다 들어 있는 sysobjects 테이블에 들어 있지요. 바로 이곳에 테이블에 대한 정보가 들어가게 됩니다. 테이블의 리스트나 정보를 보고 싶으시면? 3. SELECT에서 컬럼의 선택 부분을 다시 봐 보시면 아실 겁니다.
SQL서버의 내부를 좀더 공부하시고 싶으시면? 이 master 데이터베이스와 데이터베이스에 들어있는 시스템 테이블에 대한 공부를 조금 더 하심 많은 도움 되실 겁니다.
이 테이블을 만들때 많은 처음 시작하시는 분들이 혼동하는 부분이 있습니다. 테이블의 컬럼의 길이는 어떻게 잡아야 하나요.. 라든가.. 널가능이나 널 불가는 뭔가요? 테이블을 수정했는데... 등의 문제에 대한 이야기 입니다... 테이블 생성은 쉬운데.. 문제는 어디에다가 identity 속성을 줘서 항상 고유한 값이 이 테이블의 컬럼에 들가게 하고 싶다는것.... 등등이지요..
많은 분들이 어플리케이션 차원에서 데이터베이스를 이용하시기 때문에 내부적인 처리나 그 문제성에 대해 생각 하시기 보다는 우선 이용하는데 그치시기 때문에 생기는 문제라고 생각 한답니다.
사실 이게 테이블의 전부 랍니다. 아울러 조심 하셔야 할 부분으로.. 데이터베이스의 다른 객체 부분 이지요.. 많은 분들이 테이블에 붙게되는 이 데이터베이스 객체를 테이블에 속한다고 오해를 하시는 분들이 있습니다. 자세한 부분들은? 6. 데이터 무결성을 위한 참조무결성, 데이터형, 체크제약과 규칙, 디폴트, 트리거 부분에서 배우실 겁니다. 바로 뒷장이지요. 그러니 조금만 조급함을 누르시고 테이블을 좀더 들여다 보도록 하겠습니다. ^_^ 자 그럼 시작해 보지요. ^_^ |
******************************************************************
2. 데이터 타입(Data Type)에 대한 이해 | |||||||||||||||||
데이터 타입에 대해 좀더 깊이 들여다 보는 시간 입니다. 4. 문자 변환, 수치변환, 날짜변환, 데이터 변환 함수, 시스템 함수 부분에서 먼저 간단히 설명을 드렸습니다. 이제 이 데이터 타입을 설명 드리는 것은 아마도 마지막이 될듯 하니.. 이곳에서 간략히 설명 드린것에 이어.. 테이블 생성에 포함되는 녀석들에 대해 좀더 깊이 알아 보지요.
decimal -10^38 -1 10^38 -1 까지의 수에 대해 정밀도와 크기를 사용자에 의해 지정 가능 합니다. numeric decimal 형과 같습니다. 먼저 뽀작낼 녀석들은 이녀석들로 정했습니다. 이는 좀더 정확한 보통 회계나 큰 수치 데이터를 처리하기 위해 사용을 하게 됩니다.
decimal[(p[, s])] and numeric[(p[, s])] 이런 식으로 우선 decimal과 numeric은 p라고 하는 Precision(정확도)와 s라고 하는 scale(크기-SQL서버 데이터 형에서는 소수점 이하의 정확도를 의미)로 구성 됩니다. 간단히~~~~ decimal(5,2)라는 것은? 전체 5자리 숫자 에서~~~ 소수점 이하 2자리를 사용이 가능하다는 의미 입니다. 앗~~~ Decimal형과 Numeric 형은 완전히 같다고 보심 됩니다. ^_^ 우선 샘플을 보여 드리지요.
어떠세요? 이해가 되지요?
프리시젼과 저장 용량은 다음과 같습니다. 아울러 SQL7 까지는 프리시젼을 38자리 모두 사용하기 위해 파라미터에서 -P옵션을 주고 실행해야 했으나 SQL2000부터는 기본적으로 38자리를 모두 사용 가능합니다. 이는 @@MAX_PRECISION 전역함수로 조회가 가능 합니다.
다음으로.. FLOAT형이야기 입니다. float 부동(정확하지 않은) 소수 데이터 형으로 -1.79E + 308 부터 1.79E + 308 까지의 데이터 사용이 가능 합니다. real -3.40E + 38 부터 3.40E + 38 까지의 부동 소수 데이터 형입니다. 이는 정확하지 않은 자료형입니다. 부동 소수점이라 불리지요.. 많은분들이 이 자료형을 VC 등에서 사용하시던 가다로 인해... 특히나 FLOAT를 남발하는 경우가 있습니다. - 기분이 상하셨다면 지송함다.. 많은 버그의 원천이 되며.. 이 처리를 위해 ROUND 함수를 이용해 반올림 등의 작업으로 처리를 하시지요.. 101.5E5 , 0.5E-2 이런 데이터를 사용 하실 수도 있는 겁니다. 이제 Decimal을 배우셨으니 정확한 수치 데이터 사용에 도움 되실 거라 생각 합니다.
다음은 timestamp형 데이터 타입 입니다. SQL서버가 내부적으로 사용하는 데이터 형입니다. 가끔 이게 datetime형으로 혼돈하고 있으신 분들이 많이 있었습니다. 이는 특히나 LOG에서의 LSN정보에 대해 적용이 되는데.. SQL서버는 이 정보(일련번호)를 이용해 순서를 확인 합니다. 하나의 테이블에 1개만 생성이 가능하며.. 사용자가 이 정보를 확인은 불가 합니다.
다음으로 uniqueidentifier 입니다. 이녀석은 항상 고유한 값을 생성해 내는 newid()라는 함수에 의해 생성된 값입니다. 저말로 고유 하냐구요? 네 . 고유 합니다. 랜카드의 MAC어드레스와 값을 조합해 생성해 낸다는 정도로 코나니두 알고 있답니다. 샘플을 보여 드리면?
이런 식의 값이 생기게 된답니다. ^_^ 추후 배우실 복제에서 사용이 되기도 하구요.. 실제로 코난이는 거의 사용해본적이 없답니다. timestamp이건.. uniqueidentifier 이건.. 중복되지 않는 값이 필요할때 코난이는 identity로 거의 사용을 한답니다. ^_^
많은 분들이 흥미 있어 하실 text형 입니다. 2기가 까지 하나으 로우에 지정이 가능한 데이터 형입니다. SQL구문으로 직접 CHAR, VARCHAR형 처럼 입력이 가능 합니다. 이는 실제 extents에 저장이 되게 되며.. Data Row에는 데이터가 있는 저장소의 포인터(위치 지정자)만 저장이 된답니다. 색인의 구축이 불가하다는 단점이 있지만? 웹상의 게시판이나 그외 큰 용량의 텍스트를 처리할 경우에 종종 사용이 되긴 한답니다... SQL2000부터는 text in row라는 테이블 옵션을 줄 수 있습니다. 이 text형 데이터 또는 image형 데이터에 대해서.. 포인터로 연결된 다른 저장소(extents)에 저장하는게 아닌 테이블상에(Data Row) 저장을 가능하게 하는 옵션 입니다. 두가지 경우로 처리가 되는데.. 먼저 문자열의 길이가 text in row에 지정된 길이보다 작을 경우. 두번째는 Data Row에 문자열을 수용할만한 공간이 있을 경우 입니다. 24부터 7000 바이트 까지의 지정이 가능 합니다. 디폴트로 활성화 되어 있지 않으며 활성화 시키려면?
이런 식입니다. - 코난이가 생각하기에 이 text in row는 거의 사용할일이 없을듯.. ^_^
image 데이터형. 역시나 2기가 까지의 바이너리 데이터를 지정 가능한 데이터 형입니다. 많은 분들이 이미지 데이터를 삽입하고 싶어 하시는데요.. 가능한 이 처리는 VB와 같은 툴을 이용하는 것이 좋습니다. 실제 이 샘플 역시 코난이의 자료실에 있으니 이를 참고 하시면 많은 도움 되실 겁니다. VB로 되어 있으니 도움 되실 겁니다. 이유인 즉슨... 이를 삽입하기 위해선 특수한 방식을 사용해야 하기 때문 입니다. 많은분들이 "기냥 이미지 화일만 지정해줌 되는거 아닌가유?" 정도로 생각하고 계시는데 그렇지 않답니다. 웹상에서 이런식의 이미지를 사용하고 싶으시다면? 코난이는 업로드 컴포넌트로 이미지를 서버로 전송 받은후 특정 폴더에 화일 이름으로 구분을 해 두시고 이어서 ASP등으로 이미지의 경로만 링크 시켜 두시길 권장하고 싶습니다. 아울러 이미지 데이터 처리시 데이터를 저장할 경우와 추후 SELECT 할 경우 느릴 수 있습니다. 시스템의 부하가 증가할 수 있다는 의미 이지요. 이런 저런 이유로 코난이는 화일 시스템 상에 이런 이미지등의 데이터를 저장 한답니다. 물론 자료실과 같은 시스템을 구축할 경우도 마찬가지로 BINARY로 처리 하지 않고. 경로만 저장해 처리 하는 방식을 권장하고 싶답니다.
웃챠 이번엔 identity를 알아 보도록 할까요? 간단합니다. 테이블의 컬럼에 identity라는 속성을 지정하여 초기값, 증가값 식으로 지정하면? 맨 처음 삽입이 되면 이 컬럼의 로우에 초기값부터 증가값식으로 데이터가 자동으로 증가 하게 된답니다. 예를들어 identity(100, 10)으로 한다면? 100, 110, 120 순으로 삽입이 자동으로 되지요. 코나니는 보통 identity(1,1)으로 쓰지요. 주로 순서를 두어 고유값을 주고 싶을때 주로 사용 한답니다. ^_^
이를 중간에 이빨 빠진걸 없애구 새롭게 삽입을 시키고 싶으시면? 역시나 언급된대로 identity insert를 ON 시키고 삽입을 시키시면 되지요. 가끔 이런 질문도 있었습니다. identity를 사용하는데 다시 순서를 주고 싶다고 하시는 분이었지요. 임시방편이지만? 다시 identity를 구축하는 방법 뿐이랍니다. 컬럼을 DROP 시키고 다시 구축하는 것 뿐이지요. - 순서가 틀려질수도 있습니다. 저러한 identity insert시 중복값을 허용하지 않으려면? 뒤에서 배우실 unique 제약과 PRIMARY KEY 제약을 사용하시면 가능하긴 하답니다. 이 identity는 아주 많이 사용하게 되실 겁니다. 잘 알아두심 좋지요.
다음은 새로운 데이터 형을 생성해 보도록 할까요? ^_^ 새로운 데이터 타입은 SQL서버의 기본 데이터형을 변환해 만드는 데이터 형입니다. 복습 차원에서 설명을 드리지요~~ 1. SQL서버의 데이터베이스와 데이터베이스 개체의 이해 부분에서 설명을 드렸는데요. 복습 차원에서 한번 더 보여 드리지요.
자 이정도면 데이터 형에 대해서 깊은 이야기도 드린듯 하군요. 그럼 테이블을 생성 하실때 데이터 형의 선택에 대한 이야기를 드리지요.
1. 가능한 text형을 피하고 varchar형과 같은 문자열형을 사용하자. text형을 사용하면? 우선 속도가 느립니다. Data Row에 저장되지 않고 다른 저장소에 저장이 되기 때문입니다. 아울러 성능에 가장 많은 영향을 주는 색인의 구축 역시 불가하기 땜이지요. 풀텍스트 서치라는 엔진을 사용하면 색인의 구축이 가능하지만.. 풀텍스트 서치는 한글처리가 많이 부족하고(한글은 워드 매칭이 잘 안됩니다.) 정확도가 조금 떨어진답니다. 아울러 풀텍스트 서치를 하면? 파퓰레이션(Population)작업을 해서 색인 정보를 재구축 해야 하므로 좋지 않답니다. - 파퓰레이션 전에 삽입된 데이터는 검색이 안됩니다. 정확히 이 컬럼엔 어떤 데이터 형이 적절한지 생각해 보세요. 8KByte를 넘지 않는다면? 꼭 text형을 자제하시길 바랍니다.
2. timestamp나 uniqueidentifier 데이터형은 거의 사용할일 없습니다. 로우에 구분을 주려면? identity형이 더 적절하기 때문이지요. 아울러 timestamp형은 8Byte, uniqueidentifier 데이터형은 16Byte 입니다. 상당히 큰 크기이기 때문이지요. 가능한 identity로 구분자를 사용하시길 바랍니다.
3. 가능한 작은 데이터형을 사용합니다. int형은 2억까지 지정 가능 합니다. 4Byte이지요.. 하지만 절대 3만이 넘을 일이 없다면? smallint형으로 지정 하시면? -2^15 (-32,768) 부터 2^15 - 1 (32,767). 까지 지정하는 게 더 좋은 방식 이겠지요. - 2Byte 255 이내 까지만 사용 한다면? tiny int 형을 사용하여도 좋지요. - 1Byte 아울러 0 또는 1만 사용해 참, 거짓플래그를 주면 되는되는 일에 int형을 쓸 필요는 없을 겁니다. 이럴땐 가능하면 bit형을 쓰는게 좋지요... 물론 미래에 얼마나 커질지를 주의깊게 생각 하셔야 하는건 당연하겠지요? ^_^
4. var가 붙은 자료형. 코난이의 경험에 의하면? char과 varchar형중 varchar형을 선호 한답니다. 코난이가 알기로 char형이 아주아주 약간의 속도 향상이 있다고 합니다. 하지만 코나니가 이래저래 사용해 본 결과... char형으로 처리시 특정 처리를 프로그래밍 적으로 처리할때 오른쪽의 빈 공백문자열 처리가 더 힘듭니다. 사실 1000라인이 넘어가는 쿼리를 사용할 경우도 있는데.. 이거 찾는 것도 정말 지옥 이지요. char형으로 지정하고 rtrim 함수로 처리하고 에러 찾고 하는 것보다.. varchar형으로 쓰는것을 코난이는 권장하고 싶습니다.
웃샤... 그럼 이정도로 데이터 형에 대한 이야기는 접고.. 다음으로 테이블 생성 이야기를 드리도록 하지요. |
******************************************************************
3. 테이블 생성 | ||||||||||
자 이번엔 실제로 테이블을 생성해 보도록 하겠습니다. 테이블의 생성은 사실 어려운 부분은 전혀 아닙니다. 문제는 테이블 생성에 함께 사용되는 여러가지 개체의 생성이나 설정등의 좀더 이해가 필요한 개체들 때문에 문제가 있지요. 실제 테이블을 생성하고 처리하는 부분은 어렵지 않으니 쭉쭉 보고 나가세요.
먼저 엔터프라이즈 관리자에서 생성을 해 보도록 하겠습니다.
이런 식으로 저희는 샘플 데이터베이스인 Pubs데이터 베이스에 대해서 테이블을 생성해 보도록 하겠습니다. ^_^ 위의 그림과 같이 데이터베이스를 택한후 테이블을 선택 하세요. 그리고 바로 [새 테이블]을 선택하신후 보시면?
이런 비슷한 화면을 보실 수 있으실 겁니다. ^_^ 위의 화면과 같이 아무것도 하지 마시고.. konan_id라는 컬럼은 int형(숫자)형으로.. content라는 컬럼은 varchar(5)이라는 컬럼으로 잡읍시다.. 우선 모르시더라도 이렇게 하세요. 자 찬찬히 설명을 해 드리지요. 먼저 이렇게 테이블을 디자인 하는 화면은 7.0에 비해서 변화를 하였습니다. SQL7.0이 테이블 디자인시 조건을 모두 하나의 화면에서 처리를 했다면.. SQL2000에서는 이를 엑세스와 비슷하게 바꾸어서 사용자의 편의성을 향상시키는 방법으로 하나하나의 컬럼 세팅을 할경우 아래의 화면과 같이
이렇게 개개의 컬럼에 대해서 따로 세팅을 하는 식으로 아래쪽의 프라퍼티(속성설정)부분이 변화를 하였습니다. 간단히 설명을 드리면? 열 이름은 이 컬럼(열)의 이름을 지정하는 부분이겠지요? 물론 SQL서버가 사용하는 키워드를 사용하지 않고 처리하시는게 좋습니다. 아울러 컬럼이 어느 컬럼인지 잘 표현이 가능한 컬럼명을 사용하시는 것도 좋지요. 참고로.. 여기서 컬럼명을 user라고 잡았다고 생각해 보세요.. 이 엔터프라이즈 관리자의 디자인 테이블에서는 잘 생성이 되지만.. 실제 쿼리상에서 이는 SQL의 키워드명과 테이블명이 겹치므로 다른 방식을 사용 하셔야 합니다. [ ] 로 묶어 주셔야 한답니다.
이러한 식으로 반드시 [user]의 식으로 묶어 주셔야만 추후 처리가 가능해 지지요. 이는 개체명인 컬럼명과 테이블명에 공백문자 또는 특수문자가 사용되었을 경우에도 마찬가지 입니다. [ ] 로 묶으시면 사용이 가능합니다. 실제로 여러 케이스가 있습니다. 엑세스와 같은 DB로 사용하시다가 DTS로 SQL서버로 옮겨 오실 경우에.. 엑세스에서는 이런 user와 같은 테이블명이나 컬럼명이 사용가능 합니다.
하지만 SQL서버에서는 이를 SQL서버 내장 키워드로 보고 쿼리의 구문 에러를 내게 되지요. 이럴경우 어플리케이션으로 VB, ASP소스 코드상에는 엑세스에서 전혀 문제없이 사용 되던 쿼리가 SQL서버로 마이그레이션 하였을 경우 문제가 생기는 겁니다. 이런 케이스는 6.5에서 7.0으로 업그레이드 할 경우도 비슷 합니다. Filename이라는 키워드 등의 SQL7에서 새롭게 SQL서버가 키워드로 잡은 케이스가 있습니다. Top도 마찬가지지요.. 이럴경우 6.5 까지는 전혀 이상이 없었는데.. 7.0으로 바꾼 후부터는? 문제가 생기는 겁니다. 이럴때는 소스코드상에서 이를 [ ] 로 묶으시면 되는 거지요. 이때 참고로 " " 로 큰따옴표를 이용해도 비슷한 케이스를 볼 수 있습니다. 실제 이는 식별자로 개체를 식별하는 여러가지 방식이지요. SET QUOTED_IDENTIFIER 를 온라인 도움말에서 보시면 더 많은 도움 되실 겁니다. 개체명 식별은 이정도로 하기로 하구요... 테이블 생성의 상세한 방식을 더 알아 보지요. 다음 데이터 형식 입니다. int 또는 varchar과 같은 형들을 위에서 지정 하셨지요? 이는 저희가 지겹게 공부한 데이터 형을 지정하는 부분입니다. 문자가 들어갈 곳이면? 문자열형을 이용해 지정하시고.. 가능한 작은 데이터형을 매칭하는게 속도나 디스크 용량에 좋다고 말을 드렸구요. 길이의 경우 입니다. 이는 말 드렸듯이 고정길이 데이터형으로 int와 같은 데이터형은? 4바이트 고정입니다. 고정길이 데이터형과 가변길이 데이터형으로 varchar같은것은? 문자열의 길이를 사용자가 지정해 주어야 하는 것이지요. 이런 가변길이 컬럼에 대해서만 길이를 지정이 가능합니다. Null 허용으로 Null값을 허용할 것인지 아닌지를 지정합니다. 이는 일종의 제약으로 체크가 되어 있으면? NULL값을 받는다는 것을 의미합니다. 다음은 선택적으로 지정이 가능한 아래쪽의 속성지정을 봐 보도록 하지요.
설명 이 컬럼이 어떤 컬럼인지 지정이 가능합니다. 주석 같은 개념이라고 보심 좋겠지요.
기본값 default 제약의 다른 지정입니다. 우선 간단히 Null값을 삽입하게 될지 Null값 대신 여기에 지정된 값을 지정한다고 생각하시면 쉽겠지요. Getdate() 같은 함수역시 사용이 가능합니다.
정밀도 Decimal형이나 Numeric 형과 같은 데이터타입에서만 사용됩니다. 물론 정밀도는 전체 자리수를 의미합니다.
배율 역시나 위의 정밀도와 같이 Decimal형이나 Numeric형에서 사용됩니다. 소수점의 최대 자리수를 의미합니다.
ID Identity 에 대해서 설명을 드렸지요? 이를 사용할 것인가 안할 것인가를 결정합니다. 이때 복제(Replication)에서 사용할 것인지를 지정하는데 복제용이 아닌것으로 택하시면 됩니다. 복제용은 오로지 복제시만 지정하시는게 좋습니다.
ID 시드 이 Identity의 초기값을 지정합니다.
ID 증가값 identity의 증가값을 지정하는 부분입니다. 어렵지 않으시져?
is RowGUID GUID로 중복되지않는 고유값을 생성해 냅니다. 이에대한 설명은 앞의 데이터 타입의 이해 강좌를 참고 하세요. ^_^
수식 다음과 같은 데이터를 생각해 봅시다. 본봉 int 물론 가능합니다. 이런 케이스를 계산된 컬럼이라고 하며 생성방식은 아래와 같습니다.
이 수식 부분은 이렇게 계산된 컬럼을 이용할 경우 사용이 됩니다. ( [본봉] + [야근비] ) 이런식으로 한글 데이터이니 묶은 값을 수식 부분에 적으시면? 계산된 컬럼이 사용 가능해 집니다. SQL7.0 부터 사용 가능한 기능인데 많은 분들이 모르시더군요... 참고로 SQL2000에서부터는 이런 계산된 컬럼에 인덱스 생성이 가능합니다. 물론 SQL7.0 까지는 생성만 가능하지 인덱스 생성은 불가했지요.
데이터 정렬 이는 SQL2000의 다국어 지원으로 생긴 옵션입니다. SQL2000부터는 다국어를 데이터베이스별로 문자셋 지정이 가능하며 아울러 테이블의 컬럼별로 문자셋을 지정이 가능합니다. 간단히 한글컬럼, 일어컬럼, 중국어 컬럼을 지정한후 데이터를 넣고 일본어로 정렬(Ordering)이 가능해 졌다는 의미 이지요.. 이런 컬럼별로 지정시 정렬사용이 문제가 될수 있는 경우 입니다. 샘플을 보여 드리면?
맨 아래 부분의 ORDER BY를 일어 컬럼에 대해서 하고 있구요.. 정렬방식을 COLLATE Japanese_CI_AS DESC 로 일본어에 대해서 오름차순 정렬을 진행하는 것이지요. 이런것을 지정하는 부분입니다. 물론 지정하지 않을 경우는 데이터베이스 기본 정렬방식을 따르게 됩니다.
자 이제 EM에서의 생성방식은 어느정도 이해가 되시지요? 그외 프라이머리키 설정, 기타 제약의 설정은 다음장에서 계속 보시게 될 겁니다. 이런 제약등을 설정하는 부분이 사실 테이블 생성의 어려운 부분이지만 하나씩 정복하지요. 다음은? SQL구문으로 테이블을 생성해 보도록 하지요.
Create Table 전체 구문 정보
-_-;; 상당히 길지요.. 하지만 겁내실건 전혀 없습니다. 차근차근 배워 나가실 겁니다. 계속 언급해 드렸지만 가장 중요한건 맨 위의 한 블럭 부분 뿐입니다. 나머지는 제약등을 정의하는 부분으로 찬찬히 배우실 겁니다. 가장 간단한 테이블을 생성해 보도록 합시다.
자 대강 이런식으로 사용이 될 겁니다. 저는 konan_test2라는 테이블을 konan_id라는 int형 컬럼 하나만 가진 테이블로 생성을 하였습니다. 물론 저와 같은 식으로 테이블을 생성하지 않으셔도 됩니다. 다만 나중을 생각해 한눈에 보기 편한 방식과 저의 약간의 경험이 포함된 방식을 따르시면 추후 디버깅등이 쉬우실 거에요.. ^_^ 다음으로 개체명 짓기의 규약 입니다. ^_^ 이런 얘기 들어 보셨을 겁니다. 개체이름 짓기도 프로그래밍이다. 개체명을 잘 지으면 다른 프로젝을 함께 진행하시는 분들이 보기 쉽지요.
이러한 식의 내용입니다. 이외에 보통 표준 개발 방법론 으로 대부분의 대기업이라면 하나씩은 장문의 개발 방법론 규칙 문서를 하나씩은 가지고 계실 겁니다. 조금 서론이 길었군요. 저러한 규칙을 따르면 좋습니다. 물론 좋습니다. 하지만 개인적으로는 가능한 풀어서 쓰는것을 좋아 한답니다. 코난이의 질문과 답변 웹 게시판 = konan_web_QnA_Board 이런 식이지요. 어떤게 좋고 나쁘다를 조금 떨어져서 쳐다 보도록 해 보지요. 저런 헝거리언 표기법은 가끔 난해할 경우가 있습니다. 변수명이나 개체명의 복잡성이 증가한다는 의미 입니다. 하지만 회사가 모두 따르는 규칙이지 누구나 알 수 있지요. 아래의 경우는 처음 이 데이터베이스의 테이블을 접하시더라도 어떤 테이블인지 아실만큼 풀어두었습니다. 조금 긴게 흠이지만요.... 어떤게 좋을가요? 저는 개인적으로 아래의 방법을 선호 한답니다. 중요한건 회사의 방법론이 있다면 그걸 따르는것이 가장 좋겠지요? 그리고 제발!!!! 테이블명을 TBL1, TBL2 이렇게 짓지는 마세요.. -_-;; 아울러 컬럼명도 C1, C2 이렇게 짓지 마시구요.. T.T 정말 눈앞이 깜깜해 집니다. T.T 아울러 개체를 생성시 꼬옥 도큐먼트로 만들어 두시구요.
다른 방식의 테이블을 생성해 보지요.
테이블 생성가운데 identity(1,1)이 무엇일까요? 네 바로 열시미 배우신 자동증가 값을 지정하는 것입니다. 앞의 1은 초기값 뒤의 1은 증가값 이지요. 세번째 Insert 구문은 에러가 납니다. 문자열데이터 varchar(10)으로 잡으셨는데 데이터가 10Byte 이상이기 때문이지요. ^_^
자 여기서는 NULL, NOT NULL이라는 지정이 포함 되었습니다. 두번째의 insert 구문을 봐 볼까요? '' 이라는 빈문자열이 지정 되었습니다. 빈 문자열은 분명히 NULL 값과는 틀립니다. konan_content1 컬럼은 NOT NULL로 널값을 지정하지 못하게 하였으며 konan_content2 컬럼은 NULL값 지정이 가능하게 되어 있습니다. 차난히 생각해 보세요. 그리고 '' 이라는 빈 문자열과 NULL은 틀리다는 것을 이해 하시구요. 자 이정도면 테이블 생성의 기본은 이해 하신 겁니다. "아니 코난니마~~~ 저 긴 테이블 생성 구문은 먼가여어~~~" 말 드린대로 이제 찬찬히 배우실 내용입니다. ^_^ 전혀 걱정하실 필요 없습니다. ^_^ 테이블의 정보를 이후에도 보고 싶으시면?
이렇게 sp_help 뒤에 테이블명을 적으시면 됩니다. 마지막으로 흥미있는 내용을 알려 드리지요. 이렇게 생성한 테이블을 추후 다른 DB나 다른 서버에서 재생성 할 경우가 있으실 겁니다. 이럴때 엔터프라이즈 관리자나 쿼리로 다시 만들려면 귀찮겠지요.. T.T 한두개의 테이블도 아니라면요.. ^_^ 이럴때 이렇게 해 보세요.
이러한 식으로 테이블을 먼저 선택 하신후 마우스 오른쪽 버튼을 누르신후 SQL 스크립트 생성을 선택 하세요.
그후 이렇게 일반 탭에서 자동으로 스크립팅될 개체에 포함 됩니다. 서식 탭부분은 구문생성시의 옵션이 정의되는 부분이고
이렇게 옵션 부분을 보시면? 다양한 옵션이 지정 가능합니다. 여러가지 테이블에 걸리는 제약이나 트리거 등등의 모든 개체들을 스크립트로 다시 재생성하실 수 있습니다. ^_^ 그리고 확인을 선택하시고 SQL화일을 지정하시거나 더 속편한 방법으로 Preview를 일반 탭에서 하신후 복사해서 바로 쿼리 분석기로 확인 하신후 저장하셔도 되겠지요. 아주 좋은 방식이랍니다. ^_^ 자 이렇게 테이블 생성은 마치도록 하구요. 다음 테이블의 변경을 봐 보도록 하지요. 더 흥미진진한 이야기가 기다리고 있답니다. ^_^ |
******************************************************************
4. 테이블 수정 | ||||||||
안녕하세요. 이번에 공부할 내용은? 테이블의 수정입니다. 테이블의 생성을 이해 하셨다면? 이 테이블의 수정 역시 쉬우실 겁니다. 테이블의 수정의 많은 내용들 중에서 모든 부분을 다루는게 아니라요... 테이블을 생성하는 부분에서 하신 내용을 주로 변경하는 케이스를 다룰 겁니다.
테이블의 생성 구문이 CREATE TABLE구문으로 이루어지는 것은 아시지요? 그럼 테이블의 수정은 어떤 구문이 사용될까요? 바로 ALTER TABLE 구문이 사용 된답니다.
늘 그랬듯이 먼저 엔터프라이즈 관리자로 해보도록 하지요.
이렇게 테이블 디자인을 선택 하시구요...
요런식으루 name과 birthday 컬럼을 추가해 보도록 하지요. ^_^ 자 다시 여기에 삽입을 진행하 보도록 할까요?
자 어떠신가요? 잘 수행이 되셨나요? ^_^ 이렇게 엔터프라이즈 관리자에서 원하시는 부분을 택하시고 컬럼을 추가 하시는 것도 분명히 테이블 수정 작업 입니다. name컬럼이 현재 varchar(12)로 되어 있는데 물론 늘릴 수도 있겠지요? NULL가능 컬럼을 NOT NULL으로 바꾸실 수도 있구요. 이런 처리가 가능합니다. ^_^ 개인적으로 테이블의 생성이나 수정은 엔터프라이즈 관리자에서 작업하는 것을 선호 한답니다. ^_^
다음은 쿼리로 진행해 보도록 하지요. 역시나 먼저 구문 정보를 봐 볼까요? 여기있는 구문정보는 찬찬히 배우실 거에요.. 어떤건지 바로 읽고 그냥 넘어 가세요..
간단히 말 드렸듯이 테이블의 수정은 ALTER TABLE구문으로 진행이 됩니다.
찬찬히 배우실테니 저 구문정보는 건너 뛰시구요. konan_test1테이블의 컬럼을 변경해 보도록 하지요.
이러한식의 변경을 확인이 가능하실 겁니다. 간단하지요.
확인은 저렇게 sp_help 테이블명으로 하셔도 가능하구요. 물론 엔터프라이즈 관리자에서 확인을 하셔도 되지요. ^_^ 참고로 엔터프라이즈 관리자에서는 꼬옥 새로고침(REFRESH) 하시고 보셔야 겠지요... 자동 새로고침 기능이 없으니까요. ^_^
다음은 컬럼을 추가하는 구문을 봐 보시지요.
에러가 나시지요? ^_^ 서버: 메시지 4901, 수준 16, 상태 1, 줄 1 ALTER TABLE은 null을 허용하거나 DEFAULT 정의가 지정된 열만 추가할 수 있도록 허용합니다. 'gender' 열은 null을 허용하거나 DEFAULT 정의를 지정하지 않으므로 'konan_test1' 테이블에 추가할 수 없습니다.
별것 아닌 에러 같지만 미리미리 봐 두시면 유리합니다. 현재 gender라고 하는 컬럼을 추가 하려고 하는데요... NULL을 허용하지 않게 컬럼을 추가 하려고 합니다. 그렇다면? 이미 konan_test1테이블에는 값이 들어 있습니다. 이미 데이터가 이 테이블에 들어 있는데 새로운 컬럼을 NOT NULL로 값을 지정하지 않고 삽입하려 합니다. 그럼???? 이미 값이 있는 녀석에 대해서 NOT NULL이니 이미 값이 있는 녀석들을 어떤 값으로 대체해 주어야 하는데 불가해 졌다는 의미이지요. 이럴때 DEFAULT라는 NULL로 지정시 기본값 지정이나.. 다른 방식으로.. 코난이는 먼저 생성시는 NULL가능으로 잡고 그후에 이전 데이터에 대해서는 쿼리로 일정 값을 삽입하는 방식을 선호 한답니다. 이런 에러의 의미 이제 아시겠지요? 다시 테이블의 컬럼을 변경해 보도록 하지요.
이러한 처리가 가능해 집니다.
다음으로 컬럼을 삭제해 보도록 하지요.
이런 식으로 하나의 컬럼을 선택 하신후 DELETE키를 누르시면? 삭제가 됩니다. 작업후 반드시 저장을 누르셔야 변경이 저장되게 됩니다.
이번엔 쿼리 구문으로 해 보도록 하지요. birthday 컬럼을 제거해 보도록 합시다.
이렇게 진행이 가능해 지지요. ^_^
사실 이런 작업이 쿼리로도 가능하지만.. 저는 이런 변경 작업의 경우 가능한 엔터프라이즈 관리자를 사용해 하기를 좋아 한답니다. 우선 빠르고 직관적으로 보이니까요. ^_^;;; 아울러 작업을 한후 다시 테이블 생성구문을 스크립트로 받아낸후 저장해 두시구요. 이런 버릇을 들이시면 좋습니다. ^_^
자. 이정도면 간단히 테이블을 생성하고 수정하는 부분까지 말을 드린듯 하네요. 다음으로 테이블의 삭제 입니다.
이렇게 엔터프라이즈 관리자에서 삭제를 하시면 되구요. 어렵지 않으시져? ^_^ 동시에 여러개의 테이블을 삭제 역시 가능 하답니다.
쿼리로 삭제하는 방식은 DROP TABLE구문을 사용하시면 됩니다.
테이블 생성은 어려워도 삭제는 쉽지요? ^_^
나머지 테이블의 상세한 다른 내용은 대부분 테이블을 생성하면서 프라이머리 키를 잡거나 제약을 주거나 하는 부분입니다. 그다지 어렵지는 않으실 겁니다. 차근차근 역시나 배우실거니까요. 그럼 수고 하셨구요. 다음 최적의 테이블생성 강좌를 보시지요. |
******************************************************************
5. 최적의 성능을 위한 데이터베이스와 테이블의 설정 | |
자 거창한 이름을 가진 데이터베이스와 테이블에 대한 장입니다. 뭔가 있을듯해 보이지만 아주 간단한 원리 입니다.
먼저 전제 조건 입니다. 1. 데이터베이스는 화일 그룹으로 생성이 되어 있다. 2. 자주, 많이 사용되는 테이블과 인덱스(Index)가 있다. 3. 디스크는 SCSI타입의 디스크 이다.
이런 제약 조건 입니다. 7. 최적의 성능을 위한 물리적인 서버 구성과 데이터베이스 생성 부분을 보신 분이라면 이해 하실 겁니다. 자 그렇다면 실제 테이블을 어떻게 분산이 가능한지 알아 보도록 하지요.
이것이 의미하는 바는 화일 그룹으로 데이터베이스를 여러개의 디스크에 나누어 생성한후 해당 디스크의 화일 그룹에 테이블을 나누어 생성이 가능하다는 의미 입니다. 1개의 디스크를 이용할 경우보다 여러개의 디스크에 데이터베이스를 분산시켜 생성후(화일그룹) 개별 디스크상의 화일 그룹에 테이블을 생성하면? 부하를 낮출 수 있겠지요. 물리적으로 다른 3개의 디스크 C, D, E라는 디스크가 있을때... C디스크는 많이 사용하는 테이블 1개, D디스크는 자주 사용하지 않는 테이블 9개를 두고요 E디스크에는 인덱스 정보만 두는 식으로 사용하면 좀더 좋은 효율을 줄 수 있다는 의미 입니다. 물론 RAID와 같은 고가의 장비를 사용하지 못할 경우의 최적의 선택 입니다.
이번장은 사실 최적의 데이터베이스 생성 장의 내용 연속 입니다. CREATE TABLE구문중 ON 키워드로 해당 화일그룹에 생성이 가능하며 이어서 ON키워드를 생략하고 생성시는 PRIMARY 화일 그룹에 생성이 된다는 의미 이구요. 수고 하셨구요. 테이블 생성의 다음으로 난해할 수 있는 6. 데이터 무결성을 위한 참조무결성, 데이터형, 체크제약과 규칙, 디폴트, 트리거 를 보시겠습니다. 수고하셨습니다. |