>데이터 베이스 >MySQL 튜토리얼 >8.0.16 이전 버전에서 MySQL CHECK 제약 조건이 실패하는 이유는 무엇입니까?

8.0.16 이전 버전에서 MySQL CHECK 제약 조건이 실패하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-10 10:43:43356검색

Why Do MySQL CHECK Constraints Fail in Versions Before 8.0.16?

MySQL CHECK 제약 조건 실패 문제

데이터베이스 테이블을 정의할 때 데이터 무결성을 보장하기 위해 제약 조건을 추가하는 것이 중요합니다. CHECK 제약 조건을 사용하면 특정 열의 값이 충족해야 하는 조건을 지정할 수 있습니다. 그러나 MySQL 8.0.15 이하에서는 특별한 경우인 CHECK 제약 조건이 적용되지 않습니다.

예:

<code class="language-sql">CREATE TABLE Customer (
  SD integer CHECK (SD > 0),
  Last_Name varchar (30),
  First_Name varchar(30)
);</code>

이 테이블을 만든 후 음수 SD 값이 있는 행을 삽입해 보세요.

<code class="language-sql">INSERT INTO Customer values ('-2', 'abc', 'zz');</code>

삽입된 값이 지정된 CHECK 제약 조건을 위반하더라도 MySQL은 오류를 보고하지 않습니다. 이는 MySQL 참조 매뉴얼에 따르면 다음과 같습니다.

<code>CHECK子句会被解析,但所有存储引擎都会忽略它。</code>

해결책:

이 문제를 해결하려면 다음 중 하나를 수행하세요.

  • MySQL 8.0.16 이상으로 업그레이드: 이 버전에서는 CHECK 제약 조건을 지원하기 시작합니다. 자세한 내용은 MySQL 설명서를 참조하세요.
  • 트리거 구현: 트리거는 스토리지 엔진이 무시하는 제약 조건을 강제하는 데 사용할 수 있습니다. 아래와 같이 삽입하기 전에 SD 값을 확인하는 트리거를 생성하면 제약 조건을 효과적으로 적용할 수 있습니다.
<code class="language-sql">mysql> delimiter //
mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer 
    -> FOR EACH ROW 
    -> BEGIN 
    -> IF NEW.SD <=0 THEN SET NEW.SD=0; 
    -> END IF; 
    -> END
    -> //
mysql> delimiter ;</code>

위의 트리거 예에서는 음수의 SD 값을 0으로 설정하므로 실제 필요에 따라 트리거 로직을 수정할 수 있습니다.

위 내용은 8.0.16 이전 버전에서 MySQL CHECK 제약 조건이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.