복붙노트

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

SQL

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은이 값을 받아, 오류가 표시되지 않습니다.

해결법

  1. ==============================

    1.MySQL은 8.0.16을 지원하는 제약 조건을 확인하는 것이 첫 번째 버전입니다.

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

    https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html 읽기

    당신의 MySQL 8.0.15 이전 버전 사용하는 경우, MySQL을 참조 설명서는 말한다 :

    트리거를 시도 ...

    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 ;
    

    희망이 도움이.

  2. ==============================

    2.불행하게도 MySQL은 SQL 점검 제한 조건을 지원하지 않습니다. 당신은 호환성을 위해 귀하의 DDL 쿼리를 정의 할 수 있지만 그들은 단지 무시됩니다.

    불행하게도 MySQL은 SQL 점검 제한 조건을 지원하지 않습니다. 당신은 호환성을 위해 귀하의 DDL 쿼리를 정의 할 수 있지만 그들은 단지 무시됩니다.

    간단한 대안이있다

    당신은 INSERT 및 오류가 발생하거나 데이터의 요구 사항이 충족되지 않을 때 기본 값으로 필드를 설정하기 전 UPDATE 트리거 전에 만들 수 있습니다.

    예를 위해 삽입하기 전에 MySQL의 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도 실패 "체크 제약 조건"당신이 필드의 디폴트 값으로 ID를 설정합니다 SET NEW.ID = NULL을 사용하여 값을 덮어 쓸 수 있습니다와 함께 전달해야하지 않습니다 정말 ID 상점에 대한 이해

    편집하다: 부유 견적을 제거.

    관한 것은 : 연산자 =

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

    역 따옴표 식별자 따옴표에 관하여 :

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

  3. ==============================

    3.워드 프로세서에서 조금만 주석에 설명 된대로 CHECK 제약은 MySQL이 무시됩니다 : 테이블 만들기

    워드 프로세서에서 조금만 주석에 설명 된대로 CHECK 제약은 MySQL이 무시됩니다 : 테이블 만들기

  4. ==============================

    4.점검 제한 조건은 MySQL의 구현 될 것 같지 않습니다.

    점검 제한 조건은 MySQL의 구현 될 것 같지 않습니다.

    https://bugs.mysql.com/bug.php?id=3464 :이 버그 리포트를 참조하십시오

  5. ==============================

    5.joanq MariaDB에서 언급 한 바와 같이 지금 다른 케이크들 사이에서 CHECK 제약 조건을 지원하는 것 같습니다 :

    joanq MariaDB에서 언급 한 바와 같이 지금 다른 케이크들 사이에서 CHECK 제약 조건을 지원하는 것 같습니다 :

    "CHECK 제약 조건에 대한 지원 (인 mdev-7563)."

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

  6. ==============================

    6.점검 제한 조건이 버전 8.0.15의로 지원됩니다 (아직 발표 예정)

    점검 제한 조건이 버전 8.0.15의로 지원됩니다 (아직 발표 예정)

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

  7. ==============================

    7.MySQL은 8.0.16에 사용 검사에 업데이트 :

    MySQL은 8.0.16에 사용 검사에 업데이트 :

    MySQL의 확인 문서

  8. ==============================

    8.세트 sql_mode = 'STRICT_TRANS_TABLES'또는 SET의 sql_mode으로 시도 = 'STRICT_ALL_TABLES'

    세트 sql_mode = 'STRICT_TRANS_TABLES'또는 SET의 sql_mode으로 시도 = 'STRICT_ALL_TABLES'

  9. from https://stackoverflow.com/questions/14247655/mysql-check-constraint by cc-by-sa and MIT license