MySQL 제약조건

·2024년 4월 5일
0

MySQL

목록 보기
8/14
post-thumbnail

UNIQUE

특정 컬럼에 고유한 특성을 부여할 수 있게 해줌.

CREATE TABLE companies(
    supplier_id INT AUTO_INCREMENT,
    name VARCHAR(25) NOT NULL,
    phone VARCHAR(15) NOT NULL UNIQUE,
    address VARCHAR(255) NOT NULL,
    PRIMARY KEY(supplier_id)
);

UNIQUE가 적용된 컬럼에 동일한 값이 들어오게 되면, SQL에서 중복 에러를 일으키게 된다.


CHECK

직접 컬럼에 제약 조건을 정의하거나 만들 수 있음.

CREATE TABLE partiers(
    name VARCHAR(10),
    age INT CHECK(age > 18)
);

또한, CHECK 제약조건은 큰 제약사항이 없다.
아래처럼 다양하게 조건을 정의할 수 있음.

CREATE TABLE posts(
    word VARCHAR(100) CHECK(REVERSE(word) = word)
);

age조건에 맞지 않는 값을 삽입하려하면 아래와 같은 에러를 출력한다.

Check constraint 'users_chk_1' is violated.

해당 에러 메세지 커스텀이 가능한데,
CONSTRAINT 키워드를 사용하면 된다.

CREATE TABLE users2(
    name VARCHAR(10),
    age INT,
    CONSTRAINT age_over_18 CHECK(age > 18)
);

INSERT INTO users2(name, age) VALUES('하석진', 17);
  • 에러 출력 결과
    Check constraint 'age_over_18' is violated.

Multi-Column Check (다중 컬럼 제약조건)

여러 컬럼을 묶어서 제약조건을 생성할 수 있음.
CONSTRAINT 키워드를 사용한다.

UNIQUE 다중 제약조건

 -- 해당 예시는 UNIQUE 다중 컬럼 제약조건
 
 CREATE TABLE companies2(
     supplier_id INT AUTO_INCREMENT,
     name VARCHAR(25) NOT NULL,
     phone VARCHAR(15) NOT NULL UNIQUE,
     address VARCHAR(255) NOT NULL,
     PRIMARY KEY(supplier_id),
     CONSTRAINT name_address UNIQUE(name, address)
 );
 

 
 -- 1번 넣고
 INSERT INTO companies2(name, address, phone) VALUES('김석봉', '서울시 광진구 아모레퍼시픽', '051-223-123');
 
 -- 2번 넣으면?
  INSERT INTO companies2(name, address, phone) VALUES('김석봉', '서울시 광진구 아모레퍼시픽', '051-223-1234');

2번 넣으면?의 쿼리를 실행시키면 아래와 같은 에러가 출력된다.

Duplicate entry '김석봉-서울시 광진구 아모레퍼시픽' for key 'companies2.name_address'


CHECK 다중 제약조건

 -- 해당 예시는 CHECK 다중 컬럼 제약조건
 
CREATE TABLE houses(
    purchase_prices INT NOT NULL,
    sale_price INT NOT NULL,
    CONSTRAINT errorPrice CHECK(sale_price >= purchase_prices)
);

INSERT INTO houses(purchase_prices,sale_price) VALUES(300,100);

INSERT INTO... 쿼리를 실행시키면 다음과 같은 에러가 출력된다.

Check constraint 'errorPrice' is violated.


ALTER TABLE

테이블 or 테이블 컬럼을 변경하게 해주는 ALTER TABLE 구문
Alter Table statement

  • 컬럼 추가
ALTER TABLE companies 
ADD COLUMN phone VARCHAR(15);

-- companies 테이블에 city 컬럼을 새로 추가한다.
 
ALTER TABLE companies
ADD COLUMN employee_count INT NOT NULL DEFAULT 1;

-- companies 테이블에 employee_count 컬럼을 추가한다. INT를 받으며, NULL이 올 수 없음. 기본값으로 1을 설정한다.
  • 컬럼 삭제
ALTER TABLE suppliers DROP COLUMN city;
-- suppliers 테이블에서 city 컬럼 삭제
  • 테이블 이름 변경
RENAME TABLE companies TO suppliers
-- companies 테이블 이름을 suppliers로 변경
  • 컬럼 이름 변경
ALTER TABLE suppliers RENAME COLUMN name TO company_name;
  • 이미 존재하는 컬럼을 수정.
    ✅ 실제 컬럼을 재정의하는 것임.
ALTER TABLE suppliers MODIFY company_name VARCHAR(15) NOT NULL DEFAULT "John Doe";

해당 쿼리를 실행하면 앞으로 들어올 데이터에 기본값으로 John Doe를 넣어줄 수 있다.

✅ 체크하고 넘어가자.

Q. 기존 데이터에는 실제 컬럼을 재정의하고 DEFAULT값이 적용이 안 되는가?
A. 그렇다.

기존 데이터는 기본값 적용이 되지 않는데, 기존 데이터에DEFAULT값을 적용하고 싶다면 UPDATE 해줘야한다.

Question
MySQL 질문입니다.
기존 테이블에 아래 쿼리를 사용하여 기본값을 설정하려합니다.

ALTER TABLE suppliers MODIFY company_name VARCHAR(15) NOT NULL DEFAULT "John Doe";

그러나 해당 쿼리를 실행 후, 기존 데이터에 company_name 컬럼에 John Doe가 적용되어있는지 확인해보니 적용되지 않았습니다.

기존 데이터에는 기본값을 적용하지 못하고, 이제 들어올 새로운 데이터에만 기본값 적용이 가능합니까?

ChatGPT A.
MySQL에서 ALTER TABLE 문을 사용하여 기본값을 설정할 때, 새로운 레코드를 추가할 때만 적용됩니다.
이미 존재하는 레코드에는 적용되지 않습니다. 새로운 레코드를 추가할 때만 해당 기본값이 자동으로 할당됩니다.

기존 데이터에 기본값을 적용하려면 다음과 같은 절차를 따를 수 있습니다.

기존 데이터를 업데이트하여 기본값을 설정합니다.
혹은 기존 데이터를 변경하지 않고도 기본값이 필요한 경우, SELECT 문 등을 사용하여 데이터를 가져올 때 해당 필드가 NULL인 경우 기본값을 사용하도록 처리할 수 있습니다.

  • 기존 데이터를 업데이트 하려면 아래처럼 진행하면 된다.
UPDATE suppliers SET company_name = 'John Doe' WHERE company_name IS NULL;
  • 제약 조건 (ALTER TABLE)

    테이블이 생성된 이후 제약 조건을 추가 및 삭제하는 방법

  1. 제약 조건 추가
-- 기존 생성되어있는 houses 테이블에 제약 조건을 추가
ALTER TABLE houses ADD CONSTRAINT positive_p_price CHECK (purchase_prices >= 0);


-- 제약조건에 걸리는 데이터를 입력하면 어떤 결과가 발생하는가?
INSERT INTO houses(purchase_prices,sale_price) VALUES(-1000, 900);

결과 : 아래와 같은 에러 출력.

Check constraint 'positive_p_price' is violated.

  1. 제약 조건 삭제
ALTER TABLE houses DROP CONSTRAINT positive_p_price;

-- 해당 제약조건 삭제 후, 실행하면?
INSERT INTO houses(purchase_prices,sale_price) VALUES(-1000, 900);

1️⃣ 에서 해당 쿼리를 실행하면, 에러가 출력되었음. 하지만 지금은 제약조건이 사라졌기 때문에 에러 출력 ❌

profile
- 배움에는 끝이 없다.

0개의 댓글