본문 바로가기
IT/SQL 기초강좌 (PostgreSQL)

72강 SQL 초석 다지기 : PostgreSQL NOT NULL constraint

by DoitSQL 2023. 1. 15.
728x90

PostgreSQL 기초강의, PostgreSQL 기초강좌, constraint

72강 SQL 초석 다지기 : PostgreSQL NOT NULL constraint   

 

SQL 초석 다지기 72강 시작합니다.

 

이번 시간에는

 PostgreSQL NOT NULL constraint

에 대해서 알아보는 시간입니다.

 

요약: 이번 강의에서는 열의 값이 null이 아닌지 확인하기 위해 PostgreSQL not-null 제약 조건에 대해 알아봅니다.


데이터베이스 이론에서 NULL은 알 수 없거나 누락된 정보를 나타냅니다. NULL은 빈 문자열 또는 숫자 0과 같지 않습니다.

대화 상대의 전자 메일 주소를 테이블에 삽입해야 한다고 가정합니다. 당신은 상대방의 이메일 주소를 요청할 수 있습니다. 그러나 연락처에 전자 메일 주소가 있는지 여부를 모르는 경우 전자 메일 주소 열에 NULL을 삽입할 수 있습니다. 이 경우 NULL은 기록 시 전자 메일 주소를 알 수 없음을 나타냅니다.

NULL은 매우 특별합니다. 그것은 심지어 그 자체로도 어떤 것과도 같지 않다. NULL = NULL 식은 알 수 없는 두 값이 같지 않아야 하므로 NULL을 반환합니다.

값이 NULL인지 확인하려면 IS NULL 부울 연산자를 사용합니다. 예를 들어, 이메일 주소의 값이 NULL인 경우 다음 식을 true로 반환합니다.

email_address IS NULL  

 

IS NOT NULL 연산자는 IS NULL 연산자의 결과를 부정합니다.


PostgreSQL NOT NULL constraint   

열에서 NULL을 허용할 수 있는지 여부를 제어하려면 NOT NULL 제약 조건을 사용합니다:

CREATE TABLE table_name(
   ...
   column_name data_type NOT NULL,
   ...
);  

 

열에 NOT NULL 제약 조건이 있으면 열에 NULL을 삽입하거나 업데이트하려고 하면 오류가 발생합니다.


Declaring NOT NULL columns   

다음 CREATE TABLE 문은 NOT NULL 제약 조건을 가진 invoices 테이블을 작성합니다.

CREATE TABLE invoices(
  id SERIAL PRIMARY KEY,
  product_id INT NOT NULL,
  qty numeric NOT NULL CHECK(qty > 0),
  net_price numeric CHECK(net_price > 0) 
); 

 

이 예에서는 product_id 및 qty 열의 데이터 형식 뒤에 오는 NOT NULL 키워드를 사용하여 NOT NULL 제약 조건을 선언합니다.

열에는 NOT NULL, Check, Unique, Foreign Key 등의 여러 제약 조건이 있을 수 있습니다. 제약 조건의 순서는 중요하지 않습니다. PostgreSQL은 목록의 제약 조건을 임의의 순서로 검사할 수 있습니다.

 

NOT NULL 대신에 NULL을 사용하면 열에 NULL 및 NULL이 아닌 값이 모두 허용됩니다. NULL 또는 NOT NULL을 명시적으로 지정하지 않으면 기본적으로 NULL이 허용됩니다.


Adding NOT NULL Constraint to existing columns   

NOT NULL 제약 조건을 기존 테이블의 열에 추가하려면 다음 형식의 ALTER TABLE 문을 사용합니다:

ALTER TABLE table_name
ALTER COLUMN column_name SET NOT NULL;

 

여러 NOT NULL 제약 조건 집합을 여러 열에 추가하려면 다음 구문을 사용합니다:

ALTER TABLE table_name
ALTER COLUMN column_name_1 SET NOT NULL,
ALTER COLUMN column_name_2 SET NOT NULL,
...; 

 

 

다음 예를 살펴보겠습니다.

먼저 프로덕션 오더(production_orders)라는 새 테이블을 생성합니다:

CREATE TABLE production_orders (
     id SERIAL PRIMARY KEY,
     description VARCHAR (40) NOT NULL,
     material_id VARCHAR (16),
     qty NUMERIC,
     start_date DATE,
     finish_date DATE
); 

 

그런 다음 production_orders 테이블에 새 행을 삽입합니다:

INSERT INTO production_orders (description)
VALUES('Make for Infosys inc.');  

 

그런 다음 qty 필드가 null이 아닌지 확인하기 위해 not-null 제약 조건을 qty 열에 추가할 수 있습니다. 그러나 열에 이미 데이터가 포함되어 있습니다. null이 아닌 제약 조건을 추가하려고 하면 PostgreSQL에서 오류가 발생합니다.

NOT NULL 제약 조건을 이미 NULL을 포함하는 열에 추가하려면 다음과 같이 NULL을 NOT NULL로 먼저 업데이트해야 합니다:

UPDATE production_orders
SET qty = 1;  

 

qty 열의 값이 1로 업데이트됩니다. 이제 NOT NULL 제약 조건을 qty 열에 추가할 수 있습니다:

ALTER TABLE production_orders 
ALTER COLUMN qty
SET NOT NULL; 

 

그런 다음 material_id, start_date 및 finish_date 열에 대한 NOT NULL 제약 조건을 업데이트할 수 있습니다:

UPDATE production_orders
SET material_id = 'ABC',
    start_date = '2015-09-01',
    finish_date = '2015-09-01';  

 

NOT NULL 제약 조건을 여러 열에 추가합니다:

ALTER TABLE production_orders 
ALTER COLUMN material_id SET NOT NULL,
ALTER COLUMN start_date SET NOT NULL,
ALTER COLUMN finish_date SET NOT NULL; 

 

마지막으로 qty 열의 값을 NULL로 업데이트합니다:

UPDATE production_orders
SET qty = NULL;  

오류 메시지가 나옵니다. qty는 not null 제약조건이 있습니다.

 

 

The special case of NOT NULL constraint   

NOT NULL 제약 조건 외에도 CHECK 제약 조건을 사용하여 열이 NULL이 아닌 값을 받아들이도록 할 수 있습니다. NOT NULL 제약 조건은 다음 CHECK 제약 조건과 동일합니다:

CHECK(column IS NOT NULL) 

 

이 방법은 열 a 또는 b가 null이 아니라 둘 다가 아니기 때문에 유용합니다.

예를 들어 사용자 테이블의 사용자 이름 또는 이메일 열이 null이 아니거나 비어 있지 않을 수 있습니다. 이 경우 다음과 같이 CHECK 제약 조건을 사용할 수 있습니다:

CREATE TABLE users (
 id serial PRIMARY KEY,
 username VARCHAR (50),
 password VARCHAR (50),
 email VARCHAR (50),
 CONSTRAINT username_email_notnull CHECK (
   NOT (
     ( username IS NULL  OR  username = '' )
     AND
     ( email IS NULL  OR  email = '' )
   )
 )
); 

 

다음 문장은 에러 없이 수행됩니다..

INSERT INTO users (username, email)
VALUES
    ('user1', NULL),
    (NULL, 'email1@example.com'),
    ('user2', 'email2@example.com'),
    ('user3', ''); 

 

그러나 다음 문은 CHECK 제약 조건을 위반하므로 동작하지 않습니다:

INSERT INTO users (username, email)
VALUES
  (NULL, NULL),
  (NULL, ''),
  ('', NULL),
  ('', '');   


오늘 배운 내용을 요약하면,

  • NOT NULL 제약 조건을 사용하여 NULL을 허용하지 않는 열을 적용합니다. 기본적으로 열은 NULL을 유지할 수 있습니다.
  • 값이 NULL인지 확인하려면 IS NULL 연산자를 사용합니다. IS NOT NULL은 IS NULL의 결과를 부정합니다.
  • 값을 NULL과 비교할 때는 항상 NULL을 반환하므로 동일한 연산자 =를 사용하지 마십시오.

본 강의는 PostgreSQL Tutorial을 참조합니다.  https://www.postgresqltutorial.com/
Do it! SQL을 찾아 주셔서 감사합니다. 공감 ♥ , 댓글이 큰 힘이 됩니다.

 

728x90

댓글