[SQL] MySQL은 CHECK 제약 조건이 작동하지 않습니다
SQLMySQL은 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.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.불행하게도 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.워드 프로세서에서 조금만 주석에 설명 된대로 CHECK 제약은 MySQL이 무시됩니다 : 테이블 만들기
워드 프로세서에서 조금만 주석에 설명 된대로 CHECK 제약은 MySQL이 무시됩니다 : 테이블 만들기
-
==============================
4.점검 제한 조건은 MySQL의 구현 될 것 같지 않습니다.
점검 제한 조건은 MySQL의 구현 될 것 같지 않습니다.
https://bugs.mysql.com/bug.php?id=3464 :이 버그 리포트를 참조하십시오
-
==============================
5.joanq MariaDB에서 언급 한 바와 같이 지금 다른 케이크들 사이에서 CHECK 제약 조건을 지원하는 것 같습니다 :
joanq MariaDB에서 언급 한 바와 같이 지금 다른 케이크들 사이에서 CHECK 제약 조건을 지원하는 것 같습니다 :
"CHECK 제약 조건에 대한 지원 (인 mdev-7563)."
https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/
-
==============================
6.점검 제한 조건이 버전 8.0.15의로 지원됩니다 (아직 발표 예정)
점검 제한 조건이 버전 8.0.15의로 지원됩니다 (아직 발표 예정)
https://bugs.mysql.com/bug.php?id=3464
-
==============================
7.MySQL은 8.0.16에 사용 검사에 업데이트 :
MySQL은 8.0.16에 사용 검사에 업데이트 :
MySQL의 확인 문서
-
==============================
8.세트 sql_mode = 'STRICT_TRANS_TABLES'또는 SET의 sql_mode으로 시도 = 'STRICT_ALL_TABLES'
세트 sql_mode = 'STRICT_TRANS_TABLES'또는 SET의 sql_mode으로 시도 = 'STRICT_ALL_TABLES'
from https://stackoverflow.com/questions/14247655/mysql-check-constraint by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] ROW_NUMBER 대 SQL RANK () () (0) | 2020.03.25 |
---|---|
[SQL] 보관 JSON 데이터베이스 대에 각 키에 대한 새 열을 가진 (0) | 2020.03.25 |
[SQL] 때 SQL 테이블 별칭을 사용하는 (0) | 2020.03.25 |
[SQL] SCOPE_IDENTITY () 사용과 중첩 된 대량 삽입을 수행 할 수있는 가장 빠른 방법은? (0) | 2020.03.25 |
[SQL] 어떻게 PDO와 MySQL의 기능을 대체하는? (0) | 2020.03.24 |