제약조건

Hyuntae Jung·2022년 7월 26일
0

MS SQL

목록 보기
22/41
post-thumbnail

1. 제약 조건

: DB의 무결성(정확성)을 유지하기 위한 조건이다.

  • NOT NULL : NULL을 허용하지 않는 조건
  • UNIQUE : 중복된 값을 허용하지 않는 조건, 항상 유일한 값을 갖도록 한다
  • PRIMARY KEY(기본키) : NULL을 허용하지 않는 조건, 중복된 값을 허용하지 않는 조건
    NOT NULL + UNIQUE
  • FOREIGN KEY(외래키) : 참조되는 테이블의 컬럼 값이 존재하면 허용하는 조건
  • CHECK : 저장 가능한 데이터 값의 범위나 조건을 설정해서 설정한 값만 허용하는 조건

2. NOT NULL

2.1. NULL 값 입력

CREATE TABLE customer(
	id VARCHAR(20),
	pwd VARCHAR(20),
	name VARCHAR(20),
	phone_1 VARCHAR(3),
	phone_2 VARCHAR(8),
	birth INT,
	address VARCHAR(100)
	);
INSERT customer VALUES('sdfsd', NULL, 'sdfsd', '010',  12311235, 88-08-08, '서울시 용산구');

SELECT * 
  FROM customer;

NOT NULL 제약조건이 없으므로 NULL값을 넣을 수 있다.

DROP TABLE customer;

테이블 삭제

2.2. 제약조건명을 주는 방법

: 컬럼명 데이터형식 CONSTRAINT 제약조건명 제약조건

CREATE TABLE customer(
	id VARCHAR(20) CONSTRAINT,
	pwd VARCHAR(20) CONSTRAINT NN_pwd NOT NULL,
	name VARCHAR(20) CONSTRAINT NN_name NOT NULL,
	phone1 VARCHAR(3) NULL,
	phone2 VARCHAR(8) NULL,
	birthYear INT NULL,
	address VARCHAR(100) NULL
	);
INSERT customer VALUES('test12', 'test', NULL, '010', '12341234', 1988, '서울시 강서구');
INSERT customer VALUES(NULL, '1234', '이나영', '010', '12351451', 1968, '서울시 용산구');

name, idNOT NULL의 제약 조건이 있어 에러가 발생한다.

3. UNIQUE

: id가 중복이 돼 있으면 DB의 관리가 어렵다. UNIQUE을 통해 제약 조건을 적용할 수 있다.

USE AdventureWorks2012;  
GO  
CREATE TABLE Production.TransactionHistoryArchive4  
 (  
   TransactionID int NOT NULL,   
   CONSTRAINT AK_TransactionID UNIQUE(TransactionID)   
);   
GO

https://docs.microsoft.com/ko-kr/sql/relational-databases/tables/create-unique-constraints?view=sql-server-ver16

CREATE TABLE customer(
	id VARCHAR(20) CONSTRAINT PK_id UNIQUE,
	pwd VARCHAR(20) CONSTRAINT NN_pwd NOT NULL,
	name VARCHAR(20) CONSTRAINT NN_name NOT NULL,
	phone1 VARCHAR(3) NULL,
	phone2 VARCHAR(8) NULL,
	birthYear INT NULL,
	address VARCHAR(100) NULL
	);

4. PRIMARY KEY

: NOT NULL + UNIQUE의 조건이 모두 합친 제약 조건이다.

CREATE TABLE customer(
	id VARCHAR(20) CONSTRAINT PK_id PRIMARY KEY,
	pwd VARCHAR(20) CONSTRAINT NN_pwd NOT NULL,
	name VARCHAR(20) CONSTRAINT NN_name NOT NULL,
	phone1 VARCHAR(3) NULL,
	phone2 VARCHAR(8) NULL,
	birthYear INT NULL,
	address VARCHAR(100) NULL
	);

5. FOREIGN KEY(외래키)

: A테이블의 PRIMARY KEY(기본키)를 참조하는 B테이블의 키를 FOREIGN KEY(외래키)라한다.
이때 A테이블을 부모 테이블, B테이블을 자식 테이블이라 한다.

6. CHECK 제약 조건

CREATE TABLE customer02(
	id VARCHAR(20) CONSTRAINT PK_id2 PRIMARY KEY,
	pwd VARCHAR(20) NOT NULL,
	name VARCHAR(20) NOT NULL,
	phone1 VARCHAR(3) NULL
	CHECK(phone1 IN('010', '011', '016', '017', '018', '019')),
	phone2 VARCHAR(8) NULL,
	birthYear INT NULL
	CHECK(birthYear >= 2000 
				AND birthYear <= year(GETDATE())),
	address VARCHAR(100) NULL
	);
INSERT customer02 VALUES('test111', '12121', '김구라', '070', '12341254', '2002', '서울시 영등포구');

070CHECK 제약 조건에 해당하지 않으므로 제약 조건을 위반한다.

INSERT customer02 VALUES('test111', '12121', '김구라', '010', '12341254', '2002', '서울시 영등포구');

SELECT *
  FROM customer02;

7. DEFAULT 제약 조건

: 아무런 값을 입력하지 않았을 때 DEFAULT 값이 입력되는 조건

CREATE TABLE order01(
	id VARCHAR(20) NOT NULL,
	pcode VARCHAR(20) NOT NULL,
	order_num INT IDENTITY,
	quantity VARCHAR(20) NULL DEFAULT '1',
	orderDate DATETIME NULL DEFAULT CURRENT_TIMESTAMP
);

INSERT order01(id, pcode) VALUES('test01', 'p1');
INSERT order01(id, pcode) VALUES('test02', 'p2');

SELECT *
  FROM order01;

아무런 값이 들어가지 않았을때 DEFAULT값이 들어간다.

8. 제약조건 지정방법

CREATE TABLE order02(
	order_num IDENTITY(1,1),
	quantity VARCHAR(10) NULL,
	orderDate DATETIME NULL,
	id VARCHAR(20),
	pcode VARCHAR(20),

	CONSTRAINT PK_on PRIMARY KEY(order_num),
	CONSTRAINT FK_id FOREIGN KEY(id) REFERENCES customor(id),
	CONSTRAINT FK_pcode FOREIGN KEY(pcode) REFERENCES products(pcode)
	);

9. 복합키를 이용한 PK(기본키) 제약조건

CREATE TABLE customer03(
	name VARCHAR(20),
	phone VARCHAR(13),
	birthday DATETIME,
	address VARCHAR(80),

	CONSTRAINT PK_COMBO_nPhone PRIMARY KEY(name, phone) 
);

INSERT customer03 VALUES('김장비', '01012341234', GETDATE(),'서울시 강남구');
INSERT customer03 VALUES('김유비', '01012341234', GETDATE(),'서울시 강남구');
INSERT customer03 VALUES('김장비', '01012341235', GETDATE(),'서울시 강서구');
select * from customer03;

0개의 댓글