먼저 같은 테이블을 만들었습니다
CREATE TABLE Customer (
SD integer CHECK (SD > 0),
Last_Name varchar (30),
First_Name varchar(30)
);
그런 다음 해당 테이블에 값을 삽입했습니다.
INSERT INTO Customer values ('-2','abc','zz');
MySQL은 오류를 표시하지 않으며 값을 수락했습니다.
먼저 같은 테이블을 만들었습니다
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 ;
희망이 도움이됩니다.
CHECK
정의 된 제약 조건이 발생하면 경고를 발생시키는 것이 MySQL에서 10 분 또는 15 분의 개발 일지 궁금합니다 . 아아, 그것은 너무 간단합니다 ...
불행히도 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 모드가 사용 가능한 경우 큰 따옴표 안에 식별자를 인용 할 수도 있습니다.
DELIMITER
않습니까?
CHECK
문서의 작은 설명에 설명 된 것처럼 MySQL에서는 제약 조건이 무시됩니다. CREATE TABLE
이
CHECK
절은 구문 분석되었지만 모든 스토리지 엔진에서 무시됩니다.
CHECK
제약 조건 구현을 가진 다른 DBMS 에서 CHECK
평가 FALSE
하면 삽입 (또는 업데이트)이 수행되지 않고 오류가 발생합니다.
CHECK
제약은 MySQL의 구현 될 것 같지 않습니다.
이 버그 보고서를 참조하십시오 : https://bugs.mysql.com/bug.php?id=3464
joanq MariaDB가 언급했듯이 이제 다른 상품 중에서 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] Paul Dubois
개발자가 게시 : 8.0.15에서 수정되었습니다.
이전에는 MySQL이 제한된 형식의 CHECK 제약 조건 구문을 허용했지만 구문 분석하고 무시했습니다. MySQL은 이제 모든 스토리지 엔진에 대해 테이블 및 열 CHECK 제약 조건의 핵심 기능을 구현합니다. 제약 조건은 CREATE TABLE 및 ALTER TABLE 문을 사용하여 정의됩니다.
다음을 사용하려면 MySQL 8.0.16으로 업데이트하십시오 checks
.
MySQL 8.0.16부터 CREATE TABLE은 모든 스토리지 엔진에 대해 테이블 및 열 CHECK 제약 조건의 핵심 기능을 허용합니다. CREATE TABLE은 테이블 제약 조건과 열 제약 조건 모두에 대해 다음과 같은 CHECK 제약 조건 구문을 허용합니다.