programing

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

newsource 2022. 11. 17. 21:16

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은 프로시저 및 트리거 내에서 ROLLBLL 문 자체를 허용하지 않습니다.

트랜잭션을 롤백하지 않으려면(INSERT / UPDATE는 "체크 제약조건"에 실패하더라도 통과해야 함) 다음을 사용하여 값을 덮어쓸 수 있습니다.SET NEW.ID = NULLID를 필드의 기본값으로 설정합니다.ID tho 에는 의미가 없습니다.

편집: 잘못된 따옴표를 삭제했습니다.

에 대해서:=연산자:

와는 달리=,그:=연산자는 비교 연산자로 해석되지 않습니다.즉, 다음과 같은 기능을 사용할 수 있습니다.:=값을 변수에 할당하기 위해 유효한 SQL 문(SET 문뿐 아니라)을 클릭합니다.

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

백틱 식별자 따옴표에 대해:

식별자 따옴표는 backtick("")입니다.

ANSI_QUOTES SQL 모드가 활성화되어 있는 경우 큰따옴표 안에 식별자를 따옴표로 묶을 수도 있습니다.

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

CHECK문서에 기재되어 있는 작은 코멘트에서 설명한 바와 같이 MySQL에 의해 제약조건은 무시됩니다.

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

CHECK제약 조건이 MySQL에서 구현되지 않은 것 같습니다.

다음 오류 보고서를 참조하십시오.https://bugs.mysql.com/bug.php?id=3464

joanq MariaDB가 언급한 바와 같이 현재 다른 제품들 중에서 CHECK 제약사항을 지원하는 것으로 보입니다.

"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] 폴 뒤보아

개발자 게시: 8.0.15로 수정.

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

MySQL 8.0.16을 하도록 .0.checks:

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

MySQL 체크 매뉴얼

set sql_mode = 'STRICT_TRANS_TABLES' ★★★SET sql_mode='STRICT_ALL_TABLES'

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