[문과 코린이의 IT 기록장] MSSQL - 데이터 베이스 활용( 한글 영문 우선순위, 기본키(PK) / 유니크(UQ) 제약조건 추가/삭제, 기본키명 직접 지정 방법)
[문과 코린이의 IT 기록장] MSSQL - 데이터 베이스 활용( 한글 영문 우선순위, 기본키(PK) / 유니크(UQ) 제약조건 추가/삭제, 기본키명 직접 지정 방법)
< 참고 강의 영상 >
MSSQL Server 2016 기반의 데이터베이스 입문에서 활용까지 Part.3 대시보드 - 인프런 | 강의 (inflearn.com)
2022.01.26 - [문과 코린이의, [SQL] 기록] - [문과 코린이의 IT 기록장] MSSQL - GROUP BY 추가 설명, 다중 그룹
1. 한글 영문 우선순위
- 기본적으로 한글이 우선순위를 가진다. (한글 완성형 기준) 그렇지만, 우선순위 변경도 가능하다.
* DB 기본 데이터 정렬 속성 : Korean_Wansung_CI_AS
** 가급적 기본 데이터 정렬은 바꾸지 않는 것이 좋음.
** 속성 변경을 할 때, 유니코드 지원이 안되는 컬럼같은 경우 주의해야 할 필요 존재
1) Collaction 정보
* Collaction : 대조/조사
: SQL Server의 기본 데이터 정렬을 설정하는 옵션.
: DB 설치시에 셋팅.
* 쿼리문으로 이를 확인 가능.
-- Collaction 정보 보기
1) SELECT * FROM ::fn_helpcollations() -- 이 옵션들 중에 Korean_Wansung_CI_AS 존재
2) GUI 모드에서 바로 확인도 가능 (오른쪽 버튼 - 속성 - 일반)
2) Collaction 정보를 변경하기 위해서는?
: ALTER 명령어를 사용하면 된다.
ALTER DATABASE 디비명
COLLATE Korean_Wansung_CI_AI(변경 언어)
* 그렇지만 기본키 제약조건 등으로 안될 수 도 있기 때문에, 초보자는 DB 백업을 권한다.
3) 데이터 정렬 방법 (GUI모드)
* 해당 데이터베이스에 작업하던 상황에서, 기본 데이터 정렬 속성값을 변경하려고 하면 불가능함. (오류 뜸)
* DB의 기본 데이터 정렬 방식이 바뀐다 하더라도, 지금까지 만들어진 해당 열에 대한 데이터 정렬 속성은 변화되지 않음.
* 즉 DB의 데이터 정렬 방식이 바뀌게 되면, 그 이후에 생성되는 테이블에 대해서 적용되어짐. (이전은 변화 x)
< Korean_Wansung_CI_AS >
- CI : Case-Insensitive : 대소문자에 민감하지 않은
- AS : Accent-Sensitive
4) 영문 SQL Server
- 기본적으로 영문 기반인만큼, 기본 데이터 정렬이 한글 완성형이 아님.
- 그렇지만, 영문 DB라 하더라도, 한글 완성형 DB를 복원하면 그대로 복원이 된다.
5) COLLATE(데이터 정렬) 쿼리문 실습
a. DATABASE COLLATION(데이터 정렬) 보기
SELECT DATABASEPROPERTYEX('DB명','COLLATION')AS COLLATION
b. DATABASE TABLE COLLATION 정보 보기
EXEC sp_help [dbo.테이블명] -- 묶어주면 dbo. 사용 가능
EXEC sp_help 테이블명
c. DATABASE & TABLE COLLATION 변경하기
- 데이터베이스 기본 데이터 정렬 속성 변경
ALTER DATANBASE [DB명]
COLLATE Korean_Wansung_CI_AS -- 이로 바꿔주자.
-- 이 DB 속성을 변경하기 전에, 생성된 테이블들의 속성은 변하지 않는다. (즉 생성시 속성 상태 유지)
- 테이블 내 컬럼 기본 데이터 정렬 속성 변경
ALTER TABLE 테이블명
ALTER COLUMN 컬럼명 컬럼데이터형
-- [ 주의 ]
-- 이때 해당 컬럼명은 Primary key, Unique 등 제약조건이 걸린 것이면 안됨. (중복되는 값을 받을 수 없음).
-- 따라서 이를 변경하려고 하려면 수행이 잘 안될 것임.
COLLATE Korean_Wansung_CI_AS -- 바꿀 데이터 정렬(Collation) 속성
2. 기본키(PK) / 유니크(UQ) 제약조건 추가/삭제
CREATE DATABASE [9TO9]
USE [9TO9];
-- [1] 테이블 생성
-- 먼저 기본키 제약조건, 유니크 제약조건 없이 테이블을 생성해본다.
CREATE TABLE dbo.table_customers4(
cus_id CHAR(10) NOT NULL,
cus_name NVARCHAR(20) NOT NULL,
cus_class NVARCHAR(20) NOT NULL
)
-- [2] 인덱스 확인
-- 기본키 지정, 유니크 지정을 하지 않았기 때문에, 인덱스 확인해보면 없다고 나옴
EXEC sp_helpindex table_customers4;
-- 제약조건을 보는 코드
EXEC sp_helpconstraint table_customers4;
-- [3] 기본키 추가(제약조건 추가)
ALTER TABLE dbo.table_customers4
ADD
CONSTRAINT PK_table_customers4 PRIMARY KEY CLUSTERED(cus_id)
-- PK_table_customers4 : 제약조건 이름
-- CONSTRAINT를 안 써줘도 괜찮음.
-- CLUSTERED는 안써줘도 기본으로 CLUSTERED INDEX 생성해줌.
-- UNIQUE를 지정해주는 경우는, UQ_table_customers4로 해주면 됨.
GO -- 구분의 개념
EXEC sp_helpindex table_customers4;
GO
-- [4] 기본키 제약조건의 삭제
ALTER TABLE dbo.table_customers4
DROP
CONSTRAINT PK_table_customers4
GO
EXEC sp_helpindex table_customers4;
GO
-- [5] 유니크 제약조건의 생성
ALTER TABLE dbo.table_customers4
ADD
CONSTRAINT UQ_table_customers4 UNIQUE NONCLUSTERED(cus_name)
GO
EXEC sp_helpindex table_customers4;
-- [6] 유니크 제약조건의 삭제
ALTER TABLE dbo.table_customers4
DROP
CONSTRAINT UQ_table_customers4
EXEC sp_helpindex table_customers4;
-- 시스템 뷰 - 정보 스키마 뷰 : 테이블 컬럼들에 대한 정보를 확인 가능
-- 데이터베이스 뷰 쪽에 DB마다 생성되어 있다.
-- 테이블 각 컬럼에 대한 정보를 보거나 활용하고자 할 때 사용 가능
-- JOIN등을 통해 여러 정보를 묶어서 활용할 수 있다.
SELECT *
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE -- 컬럼들에 대한 정보를 가지고 있는 스키마
WHERE TABLE_NAME = '테이블명'
-- [7] 기본키 기존에 존재시 삭제법
-- 정확한 제약조건의 이름(cosntraint name)을 알아야 한다. (exec sp_helpconstraint에서 확인 가능)
ALTER TABLE dbo.table_customers4
DROP
CONSTRAINT 제약조건명
a. PRIMARY KEY CONSTRAINT ADD / DROP
: 중복된 값을 입력할 수 없다.
: NULL 입력할 수 없다.
b. UNIQUE CONSTRAINT ADD / DROP
: 중복된 값을 입력할 수 없다.
: NULL 입력할 수 있다. (단, NOT NULL로 지정되어 있으면 안됨)
CREATE TABLE dbo.tbl_test(
cus_id CHAR(10) PRIMARY KEY, -- PK
cus_name CHAR(10) UNIQUE, -- UQ
)
INSERT INTO dbo.tbl_test VALUES('AAA','AAA'); -- 가능
INSERT INTO dbo.tbl_test VALUES('',''); -- 공백 입력 가능
INSERT INTO dbo.tbl_test VALUES('NULL','BBB') -- NULL값이 아니라, 이는 문자값으로 인식됨. 따라서 입력 가능.
INSERT INTO dbo.tbl_test VALUES(NULL,'ABC'); -- NULL 값 입력은 불가능
INSERT INTO dbo.tbl_test VALUES('BBB',NULL) -- UQ는 NULL값 입력 가능 (문자가 아닌 실제 NULL)
INSERT INTO dbo.tbl_test VALUES('abc',NULL) -- null값을 위에서 한번 사용했기 때문에, 중복불가능의 조건에 따라 사용 x
SELECT * FROM dbo.tbl_test;
3. 기본키명 직접 지정 방법
CREATE TABLE 테이블명
(
cus_id CHAR(10) NOT NULL CONSTRAINT 제약 기본키명 PRIMARY KEY,
)
- 테이블을 만들 때 직접 기본키명을 지정해서 만들 수 있다.
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |