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 INSERT
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가 실패한 "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
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
'Programing' 카테고리의 다른 글
number (x) 또는 parseFloat (x) 중 어느 것이 더 낫습니까? (0) | 2020.07.08 |
---|---|
Linq의 목록에서 여러 필드 선택 (0) | 2020.07.08 |
Tensorflow 디버깅 정보 비활성화 (0) | 2020.07.08 |
프로그래밍 방식으로 "누가 Zebra를 소유하고 있습니까?" (0) | 2020.07.08 |
두 테이블을 함께 매핑하는 테이블의 이름은 무엇입니까? (0) | 2020.07.08 |