PostgreSQL-제약

제약 조건은 테이블의 데이터 열에 적용되는 규칙입니다. 이는 유효하지 않은 데이터가 데이터베이스에 입력되는 것을 방지하는 데 사용됩니다. 이것은 데이터베이스에있는 데이터의 정확성과 신뢰성을 보장합니다.

제약 조건은 열 수준 또는 테이블 수준 일 수 있습니다. 열 수준 제약 조건은 하나의 열에 만 적용되는 반면 테이블 수준 제약 조건은 전체 테이블에 적용됩니다. 열에 대한 데이터 유형을 정의하는 것은 그 자체로 제약입니다. 예를 들어, DATE 유형의 열은 열을 유효한 날짜로 제한합니다.

다음은 PostgreSQL에서 일반적으로 사용되는 제약 조건입니다.

  • NOT NULL Constraint − 열이 NULL 값을 가질 수 없도록합니다.

  • UNIQUE Constraint − 열의 모든 값이 다른지 확인합니다.

  • PRIMARY Key − 데이터베이스 테이블에서 각 행 / 레코드를 고유하게 식별합니다.

  • FOREIGN Key − 다른 테이블의 열을 기준으로 데이터를 제한합니다.

  • CHECK Constraint − CHECK 제약 조건은 열의 모든 값이 특정 조건을 충족하도록합니다.

  • EXCLUSION Constraint − EXCLUDE 제약 조건은 지정된 연산자를 사용하여 지정된 열 또는 표현식에서 두 행을 비교하는 경우 이러한 모든 비교가 TRUE를 반환하지 않도록합니다.

NOT NULL 제약

기본적으로 열은 NULL 값을 보유 할 수 있습니다. 열이 NULL 값을 갖지 않도록하려면 해당 열에 대해 이제 NULL이 허용되지 않음을 지정하여이 열에 이러한 제약 조건을 정의해야합니다. NOT NULL 제약 조건은 항상 열 제약 조건으로 작성됩니다.

NULL은 데이터가없는 것과 동일하지 않습니다. 오히려 알려지지 않은 데이터를 나타냅니다.

예를 들어, 다음 PostgreSQL 문은 COMPANY1이라는 새 테이블을 생성하고 5 개의 열을 추가합니다.이 중 3 개, ID 및 NAME 및 AGE는 NULL 값을 허용하지 않도록 지정합니다.

CREATE TABLE COMPANY1(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

고유 한 제약

UNIQUE 제약 조건은 두 레코드가 특정 열에서 동일한 값을 갖는 것을 방지합니다. 예를 들어 COMPANY 테이블에서 두 명 이상의 사람이 동일한 연령을 가지지 못하도록 할 수 있습니다.

예를 들어 다음 PostgreSQL 문은 COMPANY3이라는 새 테이블을 만들고 5 개의 열을 추가합니다. 여기서 AGE 열은 UNIQUE로 설정되어 있으므로 동일한 연령의 두 레코드를 가질 수 없습니다.

CREATE TABLE COMPANY3(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL UNIQUE,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00
);

기본 키 제약

PRIMARY KEY 제약 조건은 데이터베이스 테이블의 각 레코드를 고유하게 식별합니다. 더 많은 UNIQUE 열이있을 수 있지만 테이블에는 기본 키가 하나만 있습니다. 데이터베이스 테이블을 디자인 할 때 기본 키가 중요합니다. 기본 키는 고유 한 ID입니다.

테이블 행을 참조하는 데 사용합니다. 테이블 간의 관계를 만들 때 기본 키는 다른 테이블에서 외래 키가됩니다. '오랜 코딩 감독'으로 인해 기본 키는 SQLite에서 NULL이 될 수 있습니다. 이것은 다른 데이터베이스의 경우가 아닙니다.

기본 키는 데이터베이스 테이블의 각 행 / 레코드를 고유하게 식별하는 테이블의 필드입니다. 기본 키는 고유 한 값을 포함해야합니다. 기본 키 열은 NULL 값을 가질 수 없습니다.

테이블에는 하나 또는 여러 필드로 구성 될 수있는 하나의 기본 키만있을 수 있습니다. 여러 필드가 기본 키로 사용되는 경우이를composite key.

테이블에 필드에 정의 된 기본 키가있는 경우 해당 필드의 값이 동일한 두 개의 레코드를 가질 수 없습니다.

이미 ID를 기본 키로 사용하여 COMAPNY4 테이블을 생성 한 위의 다양한 예를 보았습니다.

CREATE TABLE COMPANY4(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

FOREIGN KEY 제약

외래 키 제약 조건은 열 (또는 열 그룹)의 값이 다른 테이블의 일부 행에 나타나는 값과 일치해야 함을 지정합니다. 이것은 두 개의 관련 테이블 간의 참조 무결성을 유지한다고 말합니다. 제약 조건이 외래이기 때문에 외래 키라고합니다. 즉, 테이블 외부입니다. 외래 키를 참조 키라고도합니다.

예를 들어 다음 PostgreSQL 문은 COMPANY5라는 새 테이블을 만들고 5 개의 열을 추가합니다.

CREATE TABLE COMPANY6(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

예를 들어 다음 PostgreSQL 문은 DEPARTMENT1이라는 새 테이블을 생성하여 세 개의 열을 추가합니다. EMP_ID 열은 외래 키이며 COMPANY6 테이블의 ID 필드를 참조합니다.

CREATE TABLE DEPARTMENT1(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      references COMPANY6(ID)
);

제약 조건 확인

CHECK 제약 조건은 레코드에 입력되는 값을 확인하는 조건을 활성화합니다. 조건이 거짓으로 평가되면 레코드가 제약 조건을 위반하고 테이블에 입력되지 않습니다.

예를 들어 다음 PostgreSQL 문은 COMPANY5라는 새 테이블을 만들고 5 개의 열을 추가합니다. 여기에서는 SALARY 열이있는 CHECK를 추가하므로 SALARY를 0으로 사용할 수 없습니다.

CREATE TABLE COMPANY5(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL    CHECK(SALARY > 0)
);

배제 제약

제외 제약 조건은 지정된 연산자를 사용하여 지정된 열 또는 식에서 두 행을 비교하는 경우 이러한 연산자 비교 중 하나 이상이 false 또는 null을 반환하도록합니다.

예를 들어 다음 PostgreSQL 문은 COMPANY7이라는 새 테이블을 만들고 5 개의 열을 추가합니다. 여기에 EXCLUDE 제약 조건을 추가합니다.

CREATE TABLE COMPANY7(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT,
   AGE            INT  ,
   ADDRESS        CHAR(50),
   SALARY         REAL,
   EXCLUDE USING gist
   (NAME WITH =,
   AGE WITH <>)
);

여기서 USING gist 는 구축하고 시행을 위해 사용할 인덱스 유형입니다.

데이터베이스 당 한 번씩 CREATE EXTENSION btree_gist 명령을 실행해야 합니다. 그러면 일반 스칼라 데이터 유형에 대한 제외 제약 조건을 정의하는 btree_gist 확장이 설치됩니다.

연령이 동일해야한다고 강요 했으므로 테이블에 레코드를 삽입하여이를 살펴 보겠습니다.

INSERT INTO COMPANY7 VALUES(1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY7 VALUES(2, 'Paul', 32, 'Texas', 20000.00 );
INSERT INTO COMPANY7 VALUES(3, 'Paul', 42, 'California', 20000.00 );

처음 두 INSERT 문에 대해 레코드가 COMPANY7 테이블에 추가됩니다. 세 번째 INSERT 문에 대해 다음 오류가 표시됩니다.

ERROR:  conflicting key value violates exclusion constraint "company7_name_age_excl"
DETAIL:  Key (name, age)=(Paul, 42) conflicts with existing key (name, age)=(Paul, 32).

제약 조건 삭제

제약 조건을 제거하려면 해당 이름을 알아야합니다. 이름이 알려져 있으면 쉽게 떨어 뜨릴 수 있습니다. 그렇지 않으면 시스템에서 생성 된 이름을 찾아야합니다. 여기서 psql 명령 \ d 테이블 이름이 도움이 될 수 있습니다. 일반적인 구문은-

ALTER TABLE table_name DROP CONSTRAINT some_name;