SQL

MSSQL 1.무결성 제약조건 - FOREIGN KEY, CHECK, UNIQUE

flykimjiwon 2022. 8. 4. 15:46

- FOREIGN KEY

형식: 컬럼명

데이터타입

CONSTRAINT 외래키 이름 FOREIGN KEY(참조컬럼) REFERENES 참조테이블명(참조컬럼)

참조컬럼 2개가 같아야 생성이 된다.

CREATE TABLE PRODUCT (
	PRODUCTNO INT,
	PRODUCTNAME VARCHAR(10) NOT NULL, 
	MAKEDAY DATETIME,
	PRICE FLOAT,
	PRODUCTINFO VARCHAR(MAX)
PRIMARY KEY(PRODUCTNO)
);

CREATE TABLE MARKET_CART(
	CARTNO INT,
	USERNO INT,
	PRODUCTNO INT,
	--아래 제약조건, [제약조건 FK_여기서_참조하는거 FOREIGN KEY(참조할열) 레퍼런스 참조테이블(참조열)]
	--그냥 규칙이다!
CONSTRAINT FK_MARKETCART_PRODUCTNO FOREIGN KEY(PRODUCTNO) REFERENCES PRODUCT(PRODUCTNO),
PRIMARY KEY (CARTNO)
)

INSERT INTO PRODUCT
(
PRODUCTNO,
PRODUCTNAME,
MAKEDAY,
PRICE,
PRODUCTINFO -- 컬럼 전부 적어줘서 사용하는게 좋다. 습관화 하기!
)
VALUES
(
5,
'AAA',
GETDATE(),
1500,
'AAA'
)

INSERT INTO MARKET_CART
--컬럼 안넣고 바로데이터 넣어보기
VALUES
(
1,
10,
5 -- 이건 MARKET_CART의 PRODUCTNO임, 하지만 참조하고있기 때문에 원래 PRODUCT에 PRODUCTNO에 5가있어야함
)

SELECT * FROM PRODUCT
SELECT * FROM MARKET_CART

정상적으로 MARKET_CART가생성됨!

FOREIGN 는 참조하는 칼럼의 값이 있어야만 생성이 된다.

PRODCT의 PRODUCTNO 가 5이고

MARKET_CART의 PRODUCTNO 가 5이기 때문에 생성이 된것이다.

 

ps.테이블삭제

MARKET_CART가 PRODUCT테이블을 참고하고 있기때문에

MARKET_CART먼저 삭제해줘야한다.

DROP TABLE MARKET_CART;
DROP TABLE PRODUCT;

- CHECK

형식: CONSTRAINT 제약명 CHECK(조건)

ex) CHECK(PRICE > 0), CHECK(PRICE>500), CHECK(PRICE=5000), CHECK(PRICE IN(1,2,3,4,5))....

CREATE TABLE PRODUCT
(
	PRODUCTNO INT,
	PRODUCTNAME VARCHAR(10),
	MAKEDAY DATETIME,
	PRICE FLOAT,
	PRODUCTINFO VARCHAR(MAX),
PRIMARY KEY(PRODUCTNO),
CONSTRAINT CHK_PRICE CHECK (PRICE > 0) -- PRICE = 5000이런것도가능, IN (1,2,3)도가능 소괄호 안의 숫자들만 넣을 수 있다.
)

INSERT INTO PRODUCT
(PRODUCTNO,
PRICE
)
VALUES
(
1,-5
)

SELECT * FROM PRODUCT

0보다 작은 숫자를 넣으려고하니 들어가지 않는다.

1,300 Ok

1,-5 No!

 

- UNIQUE

형식: 컬럼명 데이터타입 UNIQUE

UNIQUE로 설정된 해당 컬럼에 중복값을 허용하지 않는다. 하지만 NULL값을 허용한다. (<->PRIMARY KEY)

이와같이 만들고 PRODUCTNO만 바꿔줘도

이와같이 UNIQUE속성으로 인한 오류가 나온다.

UNIQUE 조건을준 PRODUCTNAME을 바꿔주니 정상적으로 들어간다.

또한 이와같이 NULL값도 허용이 된다.

하지만 NULL값역시 중복은 되지않는다. NULL값 역시도 한번만 가능하다!