Computer >> 컴퓨터 >  >> 프로그램 작성 >> MySQL

트리거를 사용하여 CHECK CONSTRAINT를 에뮬레이트하려면 어떻게 해야 합니까?

<시간/>

MySQL은 참조 무결성을 위해 외래 키를 지원하지만 CHECK 제약 조건은 지원하지 않는다는 것을 알고 있습니다. 그러나 트리거를 사용하여 에뮬레이션할 수 있습니다. 아래에 주어진 예의 도움으로 설명할 수 있습니다 -

예시

다음과 같이 2개의 문자, 대시, 3개의 숫자, 대시, 2개의 문자와 같은 수정 구문 등록 번호를 가질 수 있는 'car'라는 테이블이 있다고 가정합니다. -

mysql> Create table car (number char(9));
Query OK, 0 rows affected (0.32 sec)

mysql> Insert into car values('AB-235-YZ');
Query OK, 1 row affected (0.10 sec)

위의 값은 유효한 값이지만 다음 쿼리에 삽입할 값은 어떻게 됩니까?

mysql> insert into car values('AB-2X5-YZ');
Query OK, 1 row affected (0.04 sec)

위의 값은 우리가 사용하고 있는 고정된 구문에 반대되는 숫자 사이에 문자를 포함하고 있기 때문에 유효한 값이 아닙니다.

값을 삽입하기 위해 CHECK CONSTRAINT를 에뮬레이트하는 BEFORE INSERT 트리거 생성 -

이제 이러한 종류의 삽입을 방지하기 위해 다음과 같이 트리거를 만들 수 있습니다. -

mysql> delimiter //
mysql> create trigger car_insert_value before insert on car
    -> for each row
    -> begin
    -> if new.number not rlike '^[[:alpha:]]{2}-[[:digit:]]{3}-[[:alpha:]]{2}$'
    -> then
    -> signal sqlstate '45000' set message_text = 'Not a valid Number';
    -> end if;
    -> end //
Query OK, 0 rows affected (0.15 sec)

mysql> Delimiter ;
mysql> Delete from car;
Query OK, 2 rows affected (0.06 sec)

이제 잘못된 번호를 삽입하려고 하면 위에서 만든 트리거가 작업을 중지하고 다음과 같은 오류가 발생합니다. -

mysql> insert into car values('AB-2X5-YZ');
ERROR 1644 (45000): Not a Valid Number

그러나 다음과 같이 유효한 값을 삽입할 수 있습니다. -

mysql> insert into car values('AB-235-YZ');
Query OK, 1 row affected (0.04 sec)

값 업데이트를 위해 CHECK CONSTRAINT를 에뮬레이트하는 BEFORE UPDATE 트리거 생성 -

이제 잘못된 값으로 테이블을 업데이트하려고 하면 MySQL이 다음 7minus와 같이 업데이트를 중단하지 않을 것이라고 가정합니다.

mysql> update car set number='AB-2X5-YZ';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0

위 쿼리는 'car' 테이블의 잘못된 값을 업데이트했습니다. 다음 쿼리에서 우리는 테이블의 잘못된 데이터를 업데이트하는 것을 방지하는 BEFORE UPDATE 트리거를 생성할 것입니다 -

mysql> delimiter //
mysql> create trigger car_update_value before update on car
    -> for each row
    -> begin
    -> if new.number not rlike '^[[:alpha:]]{2}-[[:digit:]]{3}-[[:alpha:]]{2}$'
    -> then
    -> signal sqlstate '45000' set message_text = 'Not a valid number';
    -> end if;
    -> end //
Query OK, 0 rows affected (0.11 sec)

mysql> Delimiter ;

mysql> update car set number='AB-2X5-YZ';
ERROR 1644 (45000): Not a valid number