[mysql] MySQL의 CHECK 제약 조건이 작동하지 않습니다

먼저 같은 테이블을 만들었습니다

CREATE TABLE Customer (
  SD integer CHECK (SD > 0),
  Last_Name varchar (30),
  First_Name varchar(30)
);

그런 다음 해당 테이블에 값을 삽입했습니다.

INSERT INTO Customer values ('-2','abc','zz');

MySQL은 오류를 표시하지 않으며 값을 수락했습니다.



답변

MySQL 8.0.16 은 CHECK 제약 조건을 지원하는 첫 번째 버전입니다.

https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html을 읽으십시오.

MySQL 8.0.15 또는 이전 버전을 사용하는 경우 MySQL 참조 매뉴얼에 다음 이 표시됩니다.

CHECK절은 구문 분석되었지만 모든 스토리지 엔진에서 무시됩니다.

방아쇠를보십시오 …

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 ;

희망이 도움이됩니다.


답변

불행히도 MySQL은 SQL 검사 제약 조건을 지원하지 않습니다. 호환성을 위해 DDL 쿼리에서 정의 할 수 있지만 무시됩니다.

간단한 대안이 있습니다

데이터 요구 사항이 충족되지 않으면 오류를 발생 시키거나 필드를 기본값으로 설정하는 트리거를 생성 BEFORE INSERT하고 BEFORE UPDATE트리거 할 수 있습니다.

BEFORE INSERTMySQL 5.5 이후 작업을 위한 예제

DELIMITER $$
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test`
FOR EACH ROW
BEGIN
    IF CHAR_LENGTH( NEW.ID ) < 4 THEN
        SIGNAL SQLSTATE '12345'
            SET MESSAGE_TEXT := 'check constraint on Test.ID failed';
    END IF;
END$$
DELIMITER ;  

MySQL 5.5 이전에는 정의되지 않은 프로 시저를 호출하는 등 오류가 발생했습니다.

두 경우 모두 암시적인 트랜잭션 롤백이 발생합니다. MySQL은 프로 시저 및 트리거 내에서 ROLLBACK 문 자체를 허용하지 않습니다.

트랜잭션을 롤백하지 않으려면 (INSERT / UPDATE가 실패한 “check constraint”로도 통과해야 SET NEW.ID = NULL합니다. id를 필드 기본값으로 설정하는 값을 덮어 쓸 수 있습니다 . id에 대해서는 실제로 의미가 없습니다. 그래도

편집 :
길 잃은 따옴표를 제거했습니다.

:=운영자에 관하여 :

달리 =:=연산자는 비교 연산자로 해석되지 않습니다. 이는 :=변수에 값을 할당하기 위해 SET 문뿐만 아니라 모든 유효한 SQL 문에서 사용할 수 있음을 의미합니다 .

https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html

백틱 식별자 인용에 대해 :

식별자 인용 문자는 백틱 ( “`”)입니다.

ANSI_QUOTES SQL 모드가 사용 가능한 경우 큰 따옴표 안에 식별자를 인용 할 수도 있습니다.

http://dev.mysql.com/doc/refman/5.6/en/identifiers.html


답변

CHECK 문서의 작은 설명에 설명 된 것처럼 MySQL에서는 제약 조건이 무시됩니다. CREATE TABLE

CHECK절은 구문 분석되었지만 모든 스토리지 엔진에서 무시됩니다.


답변

CHECK제약은 MySQL의 구현 될 것 같지 않습니다.

이 버그 보고서를 참조하십시오 : https://bugs.mysql.com/bug.php?id=3464


답변

joanq MariaDB가 언급했듯이 이제 다른 상품 중에서 CHECK 제약 조건을 지원하는 것으로 보입니다.

“체크 제약 조건 지원 ( MDEV-7563 ).”

https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/


답변

점검 제한 조건은 버전 8.0.15부터 지원됩니다 (아직 릴리스)

https://bugs.mysql.com/bug.php?id=3464

[1 월 23 일 16:24] Paul Dubois

개발자가 게시 : 8.0.15에서 수정되었습니다.

이전에는 MySQL이 제한된 형식의 CHECK 제약 조건 구문을 허용했지만 구문 분석하고 무시했습니다. MySQL은 이제 모든 스토리지 엔진에 대해 테이블 ​​및 열 CHECK 제약 조건의 핵심 기능을 구현합니다. 제약 조건은 CREATE TABLE 및 ALTER TABLE 문을 사용하여 정의됩니다.


답변

다음을 사용하려면 MySQL 8.0.16으로 업데이트하십시오 checks.

MySQL 8.0.16부터 CREATE TABLE은 모든 스토리지 엔진에 대해 테이블 ​​및 열 CHECK 제약 조건의 핵심 기능을 허용합니다. CREATE TABLE은 테이블 제약 조건과 열 제약 조건 모두에 대해 다음과 같은 CHECK 제약 조건 구문을 허용합니다.

MySQL 점검 문서