English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
PostgreSQL 제약 조건은 테이블의 데이터 규칙을 지정하는 데 사용됩니다.
제약 조건을 위반하는 데이터 행동이 발생하면 행동이 제약 조건에 의해 중지됩니다.
제약 조건은 테이블을 생성할 때(CREATE TABLE 문으로) 또는 테이블이 생성된 후(ALTER TABLE 문으로) 지정할 수 있습니다.
데이터의 정확성과 신뢰성을 보장합니다.
제약 조건은 열 단계 또는 테이블 단계일 수 있습니다. 열 단계 제약 조건은 열에만 적용되며, 테이블 단계 제약 조건은 전체 테이블에 적용됩니다.
PostgreSQL에서 일반적으로 사용되는 제약 조건입니다.
NOT NULL를 의미합니다. 특정 열에 NULL 값을 저장할 수 없습니다.
UNIQUE를 보장합니다.
PRIMARY Key: NOT NULL과 UNIQUE의 결합. 특정 열(또는 두 열 이상의 결합)이 유일한 식별자를 가지도록 보장하여 특정 기록을 더 쉽게 더 빠르게 찾을 수 있도록 도와줍니다.
FOREIGN Key: 한 테이블의 데이터가 다른 테이블의 값과 일치하는 참조 일관성을 보장합니다.
CHECK: 열의 값이 지정된 조건을 충족하는지 보장합니다.
EXCLUSION: 배제 제약 조건은 두 행의 특정 열이나 표현식을 지정된 연산자로 비교할 때, 최소한 하나의 연산자가 false 또는 공백 값을 반환하는 것을 보장합니다.
기본적으로, 열은 NULL 값으로 저장될 수 있습니다. 특정 열에 NULL 값을 허용하지 않으려면 해당 열에 이 제약 조건을 정의하여 해당 열에 NULL 값을 허용하지 않도록 지정해야 합니다.
NULL은 데이터가 없는 것과 다릅니다. 그것은 불명확한 데이터를 의미합니다.
예제
아래 예제에서는 COMPANY라는 새로운 테이블을 생성했습니다.1를 추가했습니다. 5 필드가 있습니다. 그 중 세 개의 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라는 새로운 테이블을 생성했습니다.3를 추가했습니다. 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는 매우 중요합니다.
PRIMARY KEY는 주키라고 불리며, 데이터 테이블의 각 기록을 고유하게 식별하는 것입니다.
UNIQUE를 설정할 수 있는 열은 여러 개 있을 수 있지만, 하나의 테이블은 PRIMARY KEY를 설정할 수 있는 열은 하나만 있습니다.
우리는 주키를 사용하여 테이블의 행을 참조할 수 있으며, 다른 테이블의 외래 키로 주키를 설정하여 테이블 간의 관계를 생성할 수 있습니다.
주키는 비어 있지 않은 제약 조건과 고유 제약 조건의 조합입니다.
하나의 테이블은 하나의 주키만 가질 수 있으며, 이는 하나나 여러 필드로 구성될 수 있습니다. 여러 필드가 주키로 사용되면 이를 복합 키라고 합니다.
하나의 테이블이 어떤 필드에도 주키를 정의하면, 이 필드에서 두 개의 기록이 같은 값을 가질 수 없습니다.
예제
아래에서 COMAPNY를 생성합니다4 ID가 주키로 사용되는 테이블을 생성합니다:
CREATE TABLE COMPANY4( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
FOREIGN KEY는 외래 키 제약 조건으로, 특정 열(또는 열 집합)의 값이 다른 테이블의 행에 나타나는 값과 일치해야 합니다.
일반적으로 하나의 테이블의 FOREIGN KEY는 다른 테이블의 UNIQUE KEY(고유 제약 조건의 키)를 가리키며, 이는 두 관련 테이블 간의 참조 일관성을 유지합니다.
예제
아래 예제는 COMPANY 테이블을 생성한 예입니다6 테이블을 생성하고 추가합니다5개 필드:
CREATE TABLE COMPANY6( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
아래 예제에서 DEPARTMENT 테이블을 생성합니다1 테이블을 생성하고 추가합니다 3 개 필드, EMP_ID는 외래 키이며 COMPANY에 참조됩니다6 의 ID:
CREATE TABLE DEPARTMENT1( ID INT PRIMARY KEY NOT NULL, DEPT CHAR(50) NOT NULL, EMP_ID INT references COMPANY6(ID) );
CHECK 제약 조건은 열의 모든 값이 특정 조건을 만족하도록 보장합니다. 조건 값이 false라면, 그 기록은 제약 조건을 위반하고 테이블에 입력할 수 없습니다.
예제
예를 들어, 아래 예제에서 새로운 테이블 COMPANY를 생성합니다5,추가된 다섯 열. 여기서 우리는 SALARY 열에 CHECK를 추가하여 급여가 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) );
EXCLUSION 제약 조건은 지정된 연산자를 사용하여 지정된 열이나 표현식에서 양쪽의 행을 비교할 때 적어도 하나의 연산자 비교가 false 또는 null을 반환하도록 보장합니다.
예제
아래 예제는 COMPANY 테이블을 생성한 예입니다7 테이블에 추가 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 =, -- NAME이 같지만 AGE가 다르면 삽입이 허용되지 않으며, 그렇지 않으면 삽입이 허용됩니다. AGE WITH <> -- 비교 결과가 전체 테이블 표식이 true를 반환하면 삽입이 허용되지 않으며, 그렇지 않으면 허용됩니다. );
여기서 USING gist는 인덱스를 구축하고 실행하는 유형 중 하나입니다.
각 데이터베이스에 대해 CREATE EXTENSION btree_gist 명령어를 한 번 실행해야 합니다. 이 명령어는 btree_gist 확장을 설치하며, 이 확장은 원시 스칼라 데이터 타입에 대해 EXCLUDE 제약 조건을 정의합니다.
이미 나이가 동일해야 한다는 것을 강제로 설정했으므로 테이블에 레코드를 삽입하여 이를 확인해 보겠습니다:
COMPANY에 INSERT INTO7 VALUES(1, 'Paul', 32, 'California', 20000.00 ); COMPANY에 INSERT INTO7 VALUES(2, 'Paul', 32, 'Texas', 20000.00 ); -- 이 데이터의 NAME은 첫 번째 데이터와 동일하며 AGE도 첫 번째 데이터와 동일하므로 삽입 조건을 만족합니다. COMPANY에 INSERT INTO7 VALUES(3, 'Allen', 42, 'California', 20000.00 ); -- 이 데이터는 위 데이터의 NAME과 동일하지만 AGE가 다르므로 삽입이 허용되지 않습니다.
첫 두 개는 성공적으로 추가된 COMPANY7 테이블에 추가된 첫 두 개는順조건으로 추가되었습니다. 하지만 세 번째는 오류가 발생합니다:
ERROR: 중복 키 값이 독립 제약 조건 "company"을 위반합니다.7_pkey" DETAIL: 키 (id)=(3) 이미 존재합니다.
제약 조건 이름을 알아야 제약 조건을 제거할 수 있습니다. 이름을 알고 제거하려면 간단합니다. 이름을 알지 못하면 시스템이 생성한 이름을 찾아야 합니다. \d 테이블 이름을 사용하여 이 정보를 찾을 수 있습니다.
일반 문법은 다음과 같습니다:
ALTER TABLE table_name DROP CONSTRAINT some_name;