SQL의 제약 조건과 ACID
FE BE 개발 메모장/SQL & DataBase

SQL의 제약 조건과 ACID

제약조건(Constraint)은 테이블에 잘못된 데이터의 입력을 막기 위해 일정한 규칙을 지정하는 것이다. SQL에서는 여러가지 제약을 사용할 수 있다.

 

NOT NULL

 - NULL 값 입력을 허용하지 않음.
UNIQUE

 - 중복 데이터를 방지하지만, NULL의 중복은 방지 못함.

 - 테이블 내에서 항상 유일무이한 값을 가질 것

PRIMARY KEY [기본 키]

 - NOT NULL + UNIQUE 조건을 만족한다.

 - 한 테이블 내에서 단 하나의 PK만 존재

 - 해당 컬럼값은 반드시 존재해야 하고, 유일해야 한다. 

FOREGIN KEY [외래 키, 참조 키]

 - NULL값이 허용된다.

 - 다른 테이블의 데이터를 조사해서 무결성 검사.

 - 참조되는 컬럼은 반드시 UNIQUE 또는 PK로 지정

CHECK

 - 조건으로 설정된 값만 입력 가능하다.

 

제약조건 설정하기

 

우선 테스트할 DB를 생성한다음 use 'dbName'을 입력해준다.

 

PRIMARY KEY 설정

이제 테이블을 만들어보자. 컬럼들 중 반드시 하나의 PK가 존재해야 하므로 id라는 컬럼을 생성해 PK로 지정해 주었다. 

 

첫번째 방법

mysql > CREATE TABLE test1(
      > id int NOT NULL AUTO_INCREMENT,
      > test1_Id int,
      >
      > --statement...,
      >
      > PRIMARY KEY('id')
      > );

AUTO_INCREMENT를 쓰는 이유는 다음과 같다

1. 삽입/ 정렬이 빠르다.

2. 공간이 절약된다.

3. 테이블을 만들 때 주로 고유번호를 생성하는데 쓰인다.

 

AUTO_INCREMENT를 사용하면 레코드의 값이 중복되지 않고, 테이블(table)에 INSERT INTO로 레코드가 추가 될 때 마다 1씩 자동 증가된다. 기본적인 시작값은 1이다.

 

두번째 방법

mysql > CREATE TABLE TEST1(
      > id INT PRIMARY KEY,
      > test1_Id INT,
      > //statement...
      > );

세번째 방법

mysql > CREATE TABLE TEST1(
      > id INT,
      > test1_Id INT,
      > //statement...
      > );

mysql > ALTER TABLE test1 ADD PRIMARY KEY (id);

ALTER절 에서 기본키를 설정할 때에는 반드시 필드(Field또는 Column Name)가 NOT NULL이거나 설정되는지 여부를 확인 해줘야한다.

 

FOREGIN KEY 설정

 

 

트랜잭션

트랜잭션이란 여러 개의 작업들을 하나의 실행 유닛으로 묶어준 것이다. 각 트랜잭션은 하나의 특정 작업으로 시작 해 묶여있는 모든 작업들을 다 완료해야 끝난다. 만약 하나라도 실패하면 전부 실패하게 된다. 

결국 트랜잭션은 성공과 실패 두가지 결과만 존재하고, 미완료된 단계 없이 전부 성공해야한다. 이런 데이터베이스 트랜잭션의 정의는 ACID 특성들을 가지고 있다.

ACID란?

Atomicity, Consistency, Isolation, Durability를 가르킨다. 각 단어는 데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안전성을 보장하기 위해 필요한 성질이다.

 

Atomicity(원자성)

원자성(Atomicity)으로 하나의 트랜잭션이 전부 성공하거나, 전부 실패해야 되는 단적인 성질이다. 그렇기 때문에 부분적으로 실행이 되면 안된다.

 

Consistency(일관성)

데이터베이스 상태 일관성에 대한 성질이다. 쉽게 말하자면, 하나의 트랜잭션 이전과 이후의 데이터베이스 상태는 이전과 같이 유효해야 한다는 뜻이다. 

 

Isolation(고립성)

하나의 트랜잭션이 다른 트랜잭션과 독립되어야 하는 성질이다. 여러개의 트랜잭션이 동시에 수행 될 때에 각 트랜잭션은 고립되어 있어 각각의 결과를 연속적으로 실행된 것 과 동일한 결과를 나타내야 한다.

 

Durability(지속성)

하나의 트랜잭션이 성공적으로 수행되었다면 해당 트랜잭션에 대한 로그나 런타임 오류, 시스템오류가 발생해도 해당 기록은 영구적이어야 한다는 성질이다.