테이블 생성하기 | |
수칙1. 동일한 속성의 데이터 타입은 일관되게 동일하게 할당합니다.
동일한 속성을 가진 데이터를 서로 다른 테이블들에서 다른 데이터 타입으로 선언한 경우에 는 데이터의 불일치 뿐 아니라 성능 저하를 유발할 수도 있으므로 유의하기 바랍니다. 동일한 속성임에도 불구하고 테이블에 따라 데이터 타입이 다른 경우도 있고 데이터 타입은 동일하지만 길이가 다른 경우도 있습니다. 또한 예를 들어, 주민등록번호나 계좌번호와 같은 성격의 데이터들에 대해서 어떤 컬럼은 char(13)으로 선언하고‘-’(하이픈) 없이 데이터를 저 장하고 어떤 컬럼은 char(14)로 선언하여‘-’을 추가하여 저장하는 경우가 있는데, 동일한 속 성에 대해서는 동일한 데이터 타입, 동일한 데이터 포맷, 동일한 길이를 가지는 동일한 데이 터 타입을 일관되게 사용해야 합니다. 수칙2. 컬럼에 저장되는 데이터의 값, 특성 등을 고려하여 적합한 데이터 타입을 선택합니다. 컬럼에 숫자만 저장되고 계산에 사용할 가능성이 있다면 숫자 데이터 타입을 할당합니다. 숫자 데이터 타입의 경우에는 tinyint, smallint, int, bigint의 네 가지 데이터 타입이 지원되므로 저장될 데이터 값의 범위를 확인하여 데이터 타입을 선택합니다. 예를 들어 0에서 255까지의 정수를 저장할 컬럼이라면 저장소 측면에서 int 대신 tinyint를 사용하는 것이 효율적이며, 21억이 넘는 큰 값이 저장될 컬럼이라면 bigint를 사용해야 오버플로우 오류가 발생하는 것을 방지할 수 있습니다. [참고] 수칙3. 데이터 무결성을 보장할 수 있도록 제약 조건을 적절하게 정의합니다. 데이터 무결성을 유지하여 데이터베이스의 품질을 보장할 것을 권고합니다. 테이블을 계획할 때 필요한 두 가지 주요 단계가 컬럼에 대하여 유효한 값이 무엇인지 확인하고 컬럼에 저장되는 데이터의 무결성을 유지하기 위한 방법을 결정하는 것입니다. 데이터 무결성은 엔터티 무결성, 도메인 무결성, 참조 무결성, 사용자 정의 무결성의 네 개의 범주로 구성되며, PRIMARY KEY 제약 조건, UNIQUE 제약 조건, FOREIGN KEY 제약 조건, CHECK 제약 조건, DEFAULT 정의, NOT NULL 정의, RULE 정의 등을 통하여 저장되는 값의 범위를 제한함으로써 무결성을 보장할 수 있습니다. 데이터 무결성에 대한 자세한 내용은 온라인 설명서에서“데이터 무결성”에 기술되어 있는 내용을 참조하십시오. SQL Server 온라인 설명서에서 [검색] 탭을 클릭한 다음에“검색할 단어 입력”란에“데이터 형식”을 입력하여 검색하면 쉽게 찾을 수 있습니다. | |
![]() | |
PRIMARY KEY 제약 조건 | |
테이블 생성 시에는 PRIMARY KEY 제약 조건을 지정합니다. PRIMARY KEY 제약 조건은 테이블을 생성할 때에 생성하는 것이 바람직하지만, PK 제약 조건을 정의하지 않았더라도 테이블 생성 후에 추가로 생성할 수 있습니다. PRIMARY KEY 제약 조건을 설정할 컬럼은 NOT NULL 속성으로 정의되어야 하며, 고유한 데이터를 가지는 컬럼이어야 합니다. 두 개 이상의 컬럼에 PRIMARY KEY가 정의될 때에는, 각각의 컬럼에는 중복된 값이 있을 수 있지만, 키 컬럼들을 조합한 값은 고유해야 합니다. CREATE TABLE 문에서 PRIMARY KEY를 정의하는 구문에 인덱스의 종류를 지정하지 않으면 디폴트로 PK 키 컬럼(들)에 Clustered Index가 생성됩니다. 어떤 시스템의 경우에는 모든 테이블들의 PK가 무조건 clustered index로 만들어져 있고 또 어떤 시스템의 경우에는 모든 테이블들의 PK가 무조건 nonclustered index로 만들어져 있는 경우를 볼 수가 있는데, PK 제약 조건은 Clustered Index와 Nonclustered Index 두 가지 중 성능적인 측면에서 보다 효율적인 인덱스를 사용해야 한다는 것에 유의하기 바랍니다. PK를 정의할 때에는 테이블을 만들기 전에 쿼리를 종합적으로 분석하여 어떤 인덱스를 사용하는 것이 가장 효율적일지 고려하여 인덱스 유형을 정의하기 바랍니다. [따라하기]테이블 생성 시 PRIMARY KEY 제약 조건을 Nonclustered Index로 설정하기 CREATE TABLE T1 ( Col1 int NOT NULL PRIMARY KEY Nonclustered, Col2 char(3) NULL, Col3 int NULL ) GO 테이블 생성 후, PRIMARY KEY 제약 조건 설정하기 CREATE TABLE T1 ( Col1 int NOT NULL, Col2 char(3) NULL, Col3 int NULL ) GO ALTER TABLE T1 ADD CONSTRAINT PK_T1 PRIMARY KEY Nonclustered (Col1) GO | |
![]() | |
UNIQUE 제약 조건
PRIMARY KEY가 아닌 컬럼(들)에 항상 고유한 값이 저장된다면 UNIQUE 제약 조건을 생성합니다. 예를 들어, 주민등록번호 컬럼이 PRIMARY KEY가 아닌 경우에 해당 테이블에서는 주민등록번호 컬럼이 항상 고유하다면 UNIQUE 제약 조건을 추가하여 중복값이 저장되지 않도록 합니다. UNIQUE 제약 조건도 Clustered Index와 Nonclustered Index 모두 사용 가능하므로, PRIMARY KEY에서 어떤 인덱스를 사용하는지 확인하고 해당 테이블을 참조하는 쿼리를 종합적으로 분석한 다음에 결정합니다. 지면의 제약으로 이 책에는 인덱스 튜닝에 대한 내용은 포함되어 있지 않습니다. 인덱스 튜닝에 대한 내용은 웹 사이트에 게재된 아티클과 SQL Server 2000 온라인 설명서를 참조하십시오. | |
[따라하기] UNIQUE 제약 조건 선언하기 CREATE TABLE Emp ( EmpId int NOT NULL PRIMARY KEY Clustered, SSN char(13) NOT NULL UNIQUE Nonclustered, EmpName varchar(50) NOT NULL ) GO | |
FOREIGN KEY 제약 조건
참조 무결성이 보장되어야 하는 경우에는 FOREIGN KEY 제약 조건을 생성합니다. FK 제약조건이 없는 상태에서 응용 프로그램이 운영되는 상황에서 나중에 FK 제약 조건을 추가하게 되면 응용 프로그램을 수정해야 하는 경우가 발생하므로, FOREIGN KEY 제약 조건은 최초에 테이블을 생성할 때 만드는 것이 좋습니다. | |
CHECK 제약 조건
CHECK 제약 조건을 사용하면, 컬럼에 저장되는 값이나 포맷을 제한할 수 있습니다. CHECK 제약 조건을 추가하면 데이터 무결성을 보장할 수 있을 뿐 아니라, CHECK 제약 조건에 위배되는 범위의 값을 조건절에서 검색하는 경우에는 실제로 테이블을 액세스하지 않고 결과를 바로 반환하므로 성능에도 도움이 됩니다. 이와 같이 성능에 도움이 되도록 하기 위해서는 CHECK 제약 조건을 WITH CHECK 옵션으로 생성해야 합니다. [따라하기] CHECK 제약 조건 선언하기 CREATE TABLE Jobs ( Job_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, Reg_date smalldatetime NOT NULL DEFAULT (getdate()), min_lvl tinyint NOT NULL, max_lvl tinyint NOT NULL, CONSTRAINT CK_Min_Max CHECK (min_lvl < max_lvl) ) GO | |
![]() | |
DEFAULT 제약 조건 | |
사용자가 컬럼에 저장되는 값을 명시적으로 지정하지 않은 경우에 디폴트로 어떤 값이 컬럼에 저장되도록 해 주는 기능입니다. [권고사항] | |
수칙4. 항상 값이 저장되는 컬럼에 대해서는 반드시 NOT NULL로 정의합니다.
NULL이라는 값은 알 수 없는 값이라는 의미를 가지는 특수한 값입니다. NULL은 공백 문자나 0, 빈 문자열과는 전혀 다른 알 수 없는 값입니다. 항상 값이 저장되어야 하는 컬럼을 NULL 허용으로 정의하면 응용 프로그램의 오류로 NULL 값이 저장될 수 있으며, 그로 인하여 NULL 데이터로 인하여 논리적 비교가 더욱 복잡해지거나 오류 데이터로 인한 프로그램의 오동작을 유발할 수 있습니다. 그러므로 항상 명시적으로 값이 저장되는 컬럼에 대해서는 반드시 NOT NULL을 지정하기 바랍니다. [참고] SELECT object_name(c.id) AS TableName, c.name AS Identity_ColumnName , CASE WHEN t.name IN ('decimal', 'numeric') THEN t.name + '('+ CAST(c.xprec AS varchar(5)) + ',' + CAST(c.xscale AS varchar(5)) + ')' ELSE t.name END AS DataType FROM sysobjects o JOIN syscolumns c ON o.id = c.id JOIN master..systypes t ON c.xtype = t.xtype WHERE o.type = 'U' AND c.colstat & 1 = 1 ORDER BY o.name GO | |
![]() | |
테이블 삭제하기 | |
■ 구문 : DROP TABLE table_name 테이블을 삭제하면, 테이블과 해당 데이터 및 인덱스가 삭제됩니다. Foreign key 제약 조건에 의해 참조되는 테이블은 삭제할 수 없으며, 이 경우에는 참조하는 Foreign key 제약 조건을 삭제한 후 테이블을 삭제해야 합니다. 삭제된 테이블을 참조하는 뷰나 저장 프로시저는 DROP VIEW나 DROP PROCEDURE를 사용하여 삭제합니다. | |
[따라하기] 다른 데이터베이스에 존재하는 테이블 삭제하기 Sample 데이터베이스에 있는 T1 테이블을 삭제합니다. USE Northwind GO DROP TABLE Sample.dbo.T1 GO | |
테이블 변경하기 | |
■ 컬럼 추가하기 테이블에 새로운 컬럼을 추가하는 경우에 NOT NULL 속성 컬럼을 추가할 수는 있지만, 이 경우에는 반드시 DEFAULT를 지정해야 합니다. NOT NULL 속성으로 컬럼을 추가하면 Sch-M Lock으로 인한 블로킹 문제가 발생할 수 있으므로 테이블의 크기가 큰 경우에는 사전에 테스트 서버에서 소요 시간을 확인하고 서비스 휴지 시간을 충분하게 확보한 다음에 작업할 것을 권고합니다. 당장 DEFAULT를 지정할 수 없는 경우에는 일단 NULL 속성으로 컬럼을 추가하고 NULL인 데이터들을 NULL이 아닌 값으로 업데이트한 다음에, 컬럼을 NOT NULL 속성으로 변경하면 됩니다. | |
[따라하기] | |
![]() | |
■ 컬럼 삭제하기 | |
[따라하기] | |
■ 컬럼 변경하기 | |
[따라하기] 컬럼의 데이터 타입을 nchar(10)에서 char(10)으로 변경하기 USE Northwind GO SELECT * INTO OrdersTest FROM Orders GO EXEC sp_columns OrdersTest GO ALTER TABLE OrdersTest ALTER COLUMN CustomerID char(10) GO | |
![]() | |
오브젝트 이름 변경하기 | |
■ 테이블 이름 변경하기 | |
[따라하기] EXEC sp_rename 'Territories', 'Territs' GO | |
■ 테이블의 인덱스 이름 변경하기 | |
[따라하기] EXEC sp_rename 'Customers.PostalCode', 'IX_ZipCode', 'INDEX' GO
[용도] | |
■ 제약 조건 이름 변경하기 | |
[따라하기] EXEC sp_rename 'Customers_Old.PK_Customers', 'PK_Customers_Old' GO
[용도] | |
■ 저장 프로시저, 뷰, 트리거 이름 변경하기 | |
[따라하기] EXEC sp_rename 'Sales by Year', 'SalesByYear' GO
[중요] [주의 사항] | |
■ 사용자 정의 데이터 형식의 이름 변경하기 | |
[따라하기] EXEC sp_addtype 'UT_CustID', 'nchar(5)', 'NOT NULL' GO EXEC sp_rename 'UT_CustID', 'UT_CustomerID', 'USERDATATYPE' GO | |
![]() | |
테이블 소유자 변경하기 | |
[따라하기]
소유권 체인이 끊어지는 문제를 방지하기 위하여 오브젝트의 소유자를 소유자(owner)가 dbo가 아닌 오브젝트들의 소유자를 dbo로 변경하는 예제입니다. |
|
1. 테스트를 위하여 소유자가 dbo가 아닌 테이블을 만듭니다. EXEC sp_addlogin testuser, testuser, pubs GO USE pubs EXEC sp_adduser testuser, testuser, db_ddladmin GO SETUSER 'testuser' GO CREATE TABLE IncorrectOwner (c1 int) GO /* IncorrectOwner 테이블의 소유자는 dbo가 아닌 testuser가 됩니다. */ SETUSER GO2. Owner가 dbo가 아닌 사용자 테이블 목록 확인하기 SELECT name FROM sysobjects WHERE type='U' AND uid <> 1 ORDER BY name GO -- Owner 변경 스크립트 생성하기 SELECT 'EXEC sp_changeobjectowner ''' + USER_NAME(uid) + '.' + name + ''', ''dbo''' FROM sysobjects WHERE type='U' AND uid <> 1 ORDER BY name GO3. 소유권 변경 EXEC sp_changeobjectowner 'testuser.IncorrectOwner', 'dbo' GO /* 결과 창의 메시지 주의: 개체 이름 부분을 변경하면 스크립트나 저장 프로시저를 손상시킬 수 있습니다. */ | |
![]() | |
테이블 정보 확인하기 | |
■ Foreign key 제약 조건 정보 확인하기 | |
[따라하기]Customers 테이블을 Foreign key로 참조하고 있는 테이블과 컬럼 등의 기본 정보를 반환합니다. USE Northwind GO EXEC sp_fkeys N'Customers' GO | |
■ 테이블의 컬럼 Privilege 정보 확인하기 | |
[따라하기] | |
■ 테이블의 인덱스 정보 확인하기 | |
[따라하기] | |
■ 테이블의 제약 조건 정보 확인하기 | |
[따라하기] | |
■ 테이블의 모든 정보 확인하기 | |
[따라하기] | |
![]() | |
■ 테이블이 사용하는 공간 확인하기 | |
[구문] sp_spaceused [[@objname =] 'objname' ] [,[@updateusage =] 'updateusage' [따라하기] | |
![]() | |
테이블 옵션 설정하기
사용자 정의 테이블의 옵션 값을 설정합니다. | |
[구문] sp_tableoption [ @TableNamePattern = ] ' table' [@OptionName = ]' option_name' [@OptionValue = ] ' value' [따라하기] A. Orders 테이블에 'text in row' 옵션 설정하기 B. Orders 테이블에 'pintable' 옵션 설정하기 [참고] [주의] [출처] 웹디황용 |
"쇼핑몰·홈페이지·오픈마켓
블로그·페이스북·이메일 등의 각종 마케팅 글쓰기, 각종 광고, 영업, 판매, 제안서, 전단지 반응율 3배×10배 이상 높이는 마법의 8단계 공식" |
![]() |
☞자세히보기 |
|
|