티스토리 뷰

728x90

PRIMARY KEY를 지정하는 여러가지 방법은 아래처럼 3가지이고.

PRIMARY KEY의 특징은 UNIQUE, NOT NULL이다

--1. 원하는 컬럼 옆에 명시 
CREATE TABLE dbo.UserTbl (
	USERID INT IDENTITY PRIMARY KEY,
	NAME VARCHAR(10),
	AGE INT,
	ADDR VARCHAR(20)
) 
GO

--2. 테이블 생성 구문 맨 아래에 별도로 명시
CREATE TABLE dbo.UserTbl (
	USERID INT IDENTITY,
	NAME VARCHAR(10),
	AGE INT,
	ADDR VARCHAR(20),
	PRIMARY KEY (USERID, NAME)
) 
GO

--3. 이미 생성된 테이블에 지정할 경우
--ALTER TABLE - ADD PRIMARY KEY 구문 사용
CREATE TABLE dbo.UserTbl (
	USERID INT IDENTITY,
	NAME VARCHAR(10) NOT NULL,
	AGE INT,
	ADDR VARCHAR(20)
) 
GO
ALTER TABLE UserTbl ADD PRIMARY KEY (USERID,NAME)

FOREIGN KEY는 PARENT 테이블의 KEY와 CHILD 테이블의 컬럼 항목이 같아야 한다.

만약 아래에서 UserTbl의 USERID, NAME의 복합키는 참조하려고 하는데 UserTbl2 컬럼은 USERID 하나만 지정할 경우 에러가 발생한다. 

CREATE TABLE dbo.UserTbl2 (
	USERID INT IDENTITY,
	NAME VARCHAR(10) NOT NULL,
	AGE INT,
	ADDR VARCHAR(20),
	CONSTRAINT FK_USERTBL1 FOREIGN KEY (USERID,NAME)	
	REFERENCES UserTbl(USERID,NAME)
	--ON UPDATE CASCADE
	--ON DELETE CASCADE
)

ON DELETE NO ACTION - DEFAULT, 에러 OR 롤백
ON DELETE CASCADE - PARENT 테이블과 동일하게 수정
ON DELETE SET NULL - NULL 설정 (CHILE 테이블에서 NULL 허용이 되어 있어야 함)
ON DELETE SET DEFAULT - DEFAULT값 설정 (CHILD 테이블에서 DEFAULT 설정이 되어 있어야 함)

 

마지막으로 CHECK 구문은 컬럼값에 조건을 부여하고 싶을 때 사용한다.

--1. 컬럼 옆에 직접 명시
CREATE TABLE dbo.UserTbl (
	USERID INT IDENTITY,
	NAME VARCHAR(10) NOT NULL,
	AGE INT CHECK(AGE >= 1),	
	ADDR VARCHAR(20)
) 
GO

--2. 컬럼 옆에 이름과 함께 명시
CREATE TABLE dbo.UserTbl (
	USERID INT IDENTITY,
	NAME VARCHAR(10) NOT NULL,
	AGE INT CONSTRAINT POSITIVE_AGE CHECK(AGE >= 1),
	ADDR VARCHAR(20)
) 
GO

--CHECK 조건의 경우 NULL값 입력이 가능하다.
--NULL을 허용하지 않으려면 NOT NULL 조건까지 주어야 한다.
CREATE TABLE dbo.UserTbl (
	USERID INT IDENTITY,
	NAME VARCHAR(10) NOT NULL,
	AGE INT CONSTRAINT POSITIVE_AGE CHECK(AGE >= 1) NOT NULL,
	ADDR VARCHAR(20)
) 
GO

--3. 복합 컬럼의 CHECK를 원할경우
CREATE TABLE dbo.Product (
	PRODUCT_ID INT IDENTITY,
	PRODUCT_NAME VARCHAR(10) NOT NULL,
	PRICE INT CONSTRAINT POSITIVE_PRICE CHECK(PRICE >= 0) NOT NULL,
	DISCOUNT_PRICE INT CONSTRAINT POSITIVE_DPRICE CHECK(DISCOUNT_PRICE >=0),
	CHECK (DISCOUNT_PRICE < PRICE)
) 
GO

CREATE TABLE dbo.Product (
	PRODUCT_ID INT IDENTITY,
	PRODUCT_NAME VARCHAR(10) NOT NULL,
	PRICE INT NOT NULL,
	DISCOUNT_PRICE INT,
	CONSTRAINT CHK_PRICE CHECK (PRICE >= 0 AND DISCOUNT_PRICE >= 0 AND DISCOUNT_PRICE < PRICE)
) 
GO

--4. 이미 존재하는 테이블에 CHECK를 부여할 경우
CREATE TABLE dbo.Product (
	PRODUCT_ID INT IDENTITY,
	PRODUCT_NAME VARCHAR(10) NOT NULL,
	PRICE INT NOT NULL,
	DISCOUNT_PRICE INT ,
) 
GO
ALTER TABLE Product ADD CONSTRAINT CHK_PRICE CHECK (PRICE >= 0 AND DISCOUNT_PRICE >= 0 AND DISCOUNT_PRICE < PRICE)

--CHECK 삭제
ALTER TABLE Product DROP CONSTRAINT CHK_PRICE

--CHECK 조건을 일시적으로 사용하지 않을 경우
ALTER TABLE Product NOCHECK CONSTRAINT CHK_PRICE

UNIQUE 제약조건을 설정할 경우 컬럼은 유일한 값만을 가질 수 있고 다른 값과 중복될 수 없다.

PRIMARY KEY도 중복을 허용하지 않는 것은 동일하지만 NULL 허용이 되지 않는 반면,

UNIQUE는 NULL 값이 입력될 수 있다는 점이 다르다.

--1. 컬럼 옆에 명시
CREATE TABLE dbo.Product (
	PRODUCT_ID INT IDENTITY,
	PRODUCT_NAME VARCHAR(10) UNIQUE NOT NULL,
	PRICE INT NOT NULL,
	DISCOUNT_PRICE INT ,
) 
GO

--2. 테이블 생성 시 맨 아래 명시
CREATE TABLE dbo.Product (
	PRODUCT_ID INT IDENTITY,
	PRODUCT_NAME VARCHAR(10) NOT NULL,
	PRICE INT NOT NULL,
	DISCOUNT_PRICE INT ,
	UNIQUE(PRODUCT_NAME)
) 
GO

--3. CONTSTRAINT로 제약조건 이름과 함께 명시
CREATE TABLE dbo.Product (
	PRODUCT_ID INT IDENTITY,
	PRODUCT_NAME VARCHAR(10) NOT NULL,
	PRICE INT NOT NULL,
	DISCOUNT_PRICE INT ,
	CONSTRAINT UNIQUE_NAME UNIQUE(PRODUCT_NAME)
) 
GO

--4. 이미 생성된 테이블의 경우 ALTER TABLE 구문으로 설정
CREATE TABLE dbo.Product (
	PRODUCT_ID INT IDENTITY,
	PRODUCT_NAME VARCHAR(10) UNIQUE NOT NULL,
	PRICE INT NOT NULL,
	DISCOUNT_PRICE INT
) 
GO

ALTER TABLE Product ADD CONSTRAINT UNIQUE_RRODUCT UNIQUE(PRODUCT_ID,PRODUCT_NAME);
ALTER TABLE Product DROP CONSTRAINT	UNIQUE_RRODUCT

NOT NULL 조건의 경우도 아래처럼 ALTER TABLE 구문을 통해 설정이 가능하다.

ALTER TABLE Product ALTER COLUMN DISCOUNT_PRICE INT NOT NULL
ALTER TABLE Product ALTER COLUMN DISCOUNT_PRICE INT NULL
728x90
LIST

'Programming > MS SQL Server' 카테고리의 다른 글

[MS SQL SERVER] NULLIF  (0) 2021.10.29
[MS SQL SERVER] COALESCE  (0) 2021.10.29
[MS SQL SERVER] SYNONYM  (0) 2021.10.29
[MS SQL SERVER] SEQUENCE  (0) 2021.10.28
[MS SQL SERVER] IDENTITY()  (0) 2021.10.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함