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
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값 역시도 한번만 가능하다!