2016-08-06 3 views
0

0보다 작은 숫자를 삽입하지 않으려면 mysql 제약 조건을 사용하겠습니다. W3schools에서이 쿼리를 찾았습니다.Mysql check 제약 조건이 작동하지 않습니다.

CREATE TABLE Persons 
(
P_Id int NOT NULL, 
LastName varchar(255) NOT NULL, 
FirstName varchar(255), 
Address varchar(255), 
City varchar(255), 
CHECK (P_Id>0) 
) 

그러나 내가 0을 삽입하면이 작업을 수행 할 수 있습니다. 어떤 생각?

+0

[** MySQL의에서 트리거를 통해 달성하는 방법을 제약 조건을 확인하십시오 **] (http://stackoverflow.com/questions/37904425/constant -column-value-in-mysql-table/37904564 # 37904564) – 1000111

답변

1

현재 MySQL은 check을 지원하지 않습니다. 즉, 정의를 구문 분석하지만 check 부분은 무시합니다.

CHECK 절은 모든 저장소 엔진에서 구문 분석되지만 무시됩니다.

The docs

당신은 트리거를 정의하고 업데이트를 취소/필요한 경우 신호

SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid P_Id'; 

하지만, 여기에 실제 문제를 삽입 할 수 있습니다 동일한을 달성하기는 없다는 것입니다 P_Id을 자동 증가 PRIMARY KEY로 정의하십시오. 그런 다음 DB가 모든 작업을 수행합니다.

그런 다음 P_Id을 제공하지 않습니다. DB는이 열의 번호를 1부터 시작합니다.

그리고 실제로 W3Schools를 사용하면 안됩니다. 그들의 toturials 나쁘다. 다른 스토리지 엔진에 대한

1

, MySQL 서버는 구문 분석하고 FOREIGN KEY 및 참조 구문에서 CREATE TABLE 문 무시합니다. CHECK 절 은 구문 분석되지만 모든 저장소 엔진에서는 무시됩니다. 1.8.2.3 절, "외래 키 차이"를 참조하십시오.

당신은 CASE 문 및 NOT NULL 제약과 함께이 답변 CHECK constraint in MySQL is not working

0

옵션 2, 사용 생성 된 열을 참조 할 수 있습니다. 예를 들어 :

CREATE TABLE Persons 
(
P_Id int NOT NULL, 
LastName varchar(255) NOT NULL, 
FirstName varchar(255), 
Address varchar(255), 
City varchar(255), 
CHECK_GEN_FIELD int AS (CASE WHEN P_Id>0 THEN 1 ELSE NULL END) NOT NULL 
); 

쿼리 OK, 0 열의 영향 (0.04 초)

의 MySQL> (P_Id, 성) 사람에 삽입 된 값 (10 '검사');

쿼리 OK, 1 행의 영향 (0.00 초)

의 MySQL> 사람 (P_Id, 성)에 삽입 된 값 (0, '테스트');

ERROR 1048 (23000) : 열 'CHECK_GEN_FIELD는'null 일 수 없습니다

관련 문제