Programing

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

lottogame 2020. 7. 8. 08:15
반응형

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의 구현 될 것 같지 않습니다.

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


As mentioned by joanq MariaDB now seems to support CHECK constraints among other goodies:

"Support for CHECK CONSTRAINT (MDEV-7563)."

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


Check constraints are supported as of version 8.0.15 (yet to be released)

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

[23 Jan 16:24] Paul Dubois

Posted by developer: Fixed in 8.0.15.

Previously, MySQL permitted a limited form of CHECK constraint syntax, but parsed and ignored it. MySQL now implements the core features of table and column CHECK constraints, for all storage engines. Constraints are defined using CREATE TABLE and ALTER TABLE statements.


Update to MySQL 8.0.16 to use checks:

As of MySQL 8.0.16, CREATE TABLE permits the core features of table and column CHECK constraints, for all storage engines. CREATE TABLE permits the following CHECK constraint syntax, for both table constraints and column constraints

MySQL Checks Documentation


try with set sql_mode = 'STRICT_TRANS_TABLES' OR SET sql_mode='STRICT_ALL_TABLES'

참고URL : https://stackoverflow.com/questions/2115497/check-constraint-in-mysql-is-not-working

반응형