SQL 널 값의 이상함

4 days ago 8

  • SQL NULL은 이상함

  • SQL에서 NULL 값은 독특하게 처리됨. UNIQUE 제약 조건이 있는 열은 여러 NULL 값을 가질 수 있음. 이는 각 NULL 값이 다른 NULL과 다른 독립적인 값으로 간주되기 때문임. SQLite, Postgres, MySQL 모두 동일하게 동작함.

  • 기준 설정

    • 논리적 등호(=) 연산자를 사용하여 값을 비교할 때 NULL = NULL은 NULL을 반환함. 이는 두 개의 미지의 값이 동일하지 않다고 간주되기 때문임.
    • IS 연산자를 사용하면 NULL의 정체성을 확인할 수 있음. 예를 들어, null is null은 TRUE를 반환함.
  • 고유성에 대해

    • UNIQUE 제약 조건이 있는 열에 NULL 값이 포함된 경우, NULL 값은 서로 다른 것으로 간주되어 고유성 제약 조건을 위반하지 않음.
    • 예를 들어, ('ray@mail.com', NULL)과 ('ray@mail.com', NULL)은 서로 다른 행으로 간주됨.
  • NULL이 이렇게 처리되는 이유

    • SQLite 및 다른 SQL 호환 데이터베이스는 NULL을 다른 데이터베이스와 일관되게 처리하기 위해 이렇게 구현됨. SQL 표준 문서는 NULL이 모든 곳에서 고유해야 한다고 제안하지만, 실제로는 대부분의 SQL 엔진이 SELECT DISTINCT나 UNION에서 NULL을 고유하게 처리하지 않음.
  • 고유성을 보장하는 방법

    • 생성된 열 사용

      • NULL이 아닌 결정론적 값을 항상 가지는 열을 생성하여 문제를 완화할 수 있음. 예를 들어, COALESCE(deleted_at, '1970-01-01')를 사용하여 NULL 값을 대체할 수 있음.
      • 이 방법은 테이블에 추가 필드를 추가하여 공간을 차지할 수 있음.
    • 부분 인덱스 사용

      • deleted_at이 NULL인 경우에만 email에 대한 부분 인덱스를 생성하여 고유성을 보장할 수 있음.
      • 부분 인덱스는 테이블을 넓히지 않고 공간을 덜 차지하며, 동일한 레코드 쌍을 반복적으로 삭제할 때 오류가 발생하지 않음.
  • 업데이트

    • Oracle은 빈 문자열을 NULL로 처리함.
  • 결론

    • ORM을 사용할 때는 보이지 않지만, SQL NULL의 독특한 처리 방식은 혼란을 초래할 수 있음. SQL 표준 문서는 공개적으로 제공되지 않으며, 비용을 지불해야만 구할 수 있음.

Read Entire Article