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은 프로시저 및 트리거 내에서 ROLLBLL 문 자체를 허용하지 않습니다.
트랜잭션을 롤백하지 않으려면(INSERT / UPDATE는 "체크 제약조건"에 실패하더라도 통과해야 함) 다음을 사용하여 값을 덮어쓸 수 있습니다.SET NEW.ID = NULL
ID를 필드의 기본값으로 설정합니다.ID tho 에는 의미가 없습니다.
편집: 잘못된 따옴표를 삭제했습니다.
에 대해서:=
연산자:
와는 달리
=
,그:=
연산자는 비교 연산자로 해석되지 않습니다.즉, 다음과 같은 기능을 사용할 수 있습니다.:=
값을 변수에 할당하기 위해 유효한 SQL 문(SET 문뿐 아니라)을 클릭합니다.
https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html
백틱 식별자 따옴표에 대해:
식별자 따옴표는 backtick("")입니다.
ANSI_QUOTES SQL 모드가 활성화되어 있는 경우 큰따옴표 안에 식별자를 따옴표로 묶을 수도 있습니다.
http://dev.mysql.com/doc/refman/5.6/en/identifiers.html
CHECK
문서에 기재되어 있는 작은 코멘트에서 설명한 바와 같이 MySQL에 의해 제약조건은 무시됩니다.
그
CHECK
절은 구문 분석되지만 모든 스토리지 엔진에서 무시됩니다.
그CHECK
제약 조건이 MySQL에서 구현되지 않은 것 같습니다.
다음 오류 보고서를 참조하십시오.https://bugs.mysql.com/bug.php?id=3464
joanq MariaDB가 언급한 바와 같이 현재 다른 제품들 중에서 CHECK 제약사항을 지원하는 것으로 보입니다.
"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] 폴 뒤보아
개발자 게시: 8.0.15로 수정.
이전에 MySQL은 제한된 형식의 CHECK 제약 조건 구문을 허용했지만 구문 분석 및 무시했습니다.MySQL은 이제 모든 스토리지 엔진에 대해 테이블 및 열 CHECK 제약 조건의 핵심 기능을 구현합니다.제약조건은 CREATE TABLE 및 ALTER TABLE 문을 사용하여 정의합니다.
MySQL 8.0.16을 하도록 .0.checks
:
MySQL 8.0.16 이후 CREATE TABLE은 모든 스토리지 엔진에 대해 테이블 및 열 CHECK 제약 조건의 핵심 기능을 허용합니다.CREATE TABLE은 테이블 제약 조건과 열 제약 조건 모두에 대해 다음 CHECK 제약 조건 구문을 허용합니다.
set sql_mode = 'STRICT_TRANS_TABLES'
★★★SET sql_mode='STRICT_ALL_TABLES'
언급URL : https://stackoverflow.com/questions/2115497/check-constraint-in-mysql-is-not-working
'programing' 카테고리의 다른 글
1개의 치환콜로 여러 문자를 치환하다 (0) | 2022.11.17 |
---|---|
JSONDecodeError: 예상 값: 1행 1열(char 0) (0) | 2022.11.17 |
GitHub에서 호스트되는 외부 JavaScript 파일 링크 및 실행 (0) | 2022.11.17 |
mysql: 특정 데이터베이스에 대해 열려 있는 모든 연결을 볼 수 있습니까? (0) | 2022.11.17 |
PHP에서 디렉터리 크기를 가져오는 방법 (0) | 2022.11.17 |