먼저 같은 테이블을 만들었습니다
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 모드가 사용 가능한 경우 큰 따옴표 안에 식별자를 인용 할 수도 있습니다.
답변
CHECK
문서의 작은 설명에 설명 된 것처럼 MySQL에서는 제약 조건이 무시됩니다. CREATE TABLE
이
CHECK
절은 구문 분석되었지만 모든 스토리지 엔진에서 무시됩니다.
답변
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 제약 조건 구문을 허용합니다.