말에 순서를 적용 나는 다음과 같은 테이블을 item_a_id 및 item_b_id 복합 기본 키입니다복합 기본 키
item_a_id, item_b_id, value
있습니다. 내 예제에서 a, b 및 b는 a가 동일합니다. 따라서 나는 item_a_id < item_b_id를 확실히하고 싶습니다. 분명히 애플리케이션 로직이이를 시행 할 것이지만 데이터베이스를 보장 할 수있는 방법이 있습니까?
말에 순서를 적용 나는 다음과 같은 테이블을 item_a_id 및 item_b_id 복합 기본 키입니다복합 기본 키
item_a_id, item_b_id, value
있습니다. 내 예제에서 a, b 및 b는 a가 동일합니다. 따라서 나는 item_a_id < item_b_id를 확실히하고 싶습니다. 분명히 애플리케이션 로직이이를 시행 할 것이지만 데이터베이스를 보장 할 수있는 방법이 있습니까?
적당히 최신 버전의 MySql에서 트리거를 사용하여 원하는 동작을 생성하는 emulate a check constraint을 생성 할 수 있습니다.
글쎄, 당신의 경우, 삽입/업데이트 전에 item_a_id
이 항상 item_b_id
보다 작은 지 확인하기 위해 값을 확인하기 위해 트리거를 사용할 수 있습니다. 테이블 이름이 item_links
입니다 가정
, 당신이 시도 할 수 : 나는 삽입 테스트 할 때
다음DELIMITER |
CREATE TRIGGER ensure_a_b_before_insert BEFORE INSERT ON item_links
FOR EACH ROW
BEGIN
IF NEW.item_a_id > NEW.item_b_id THEN
SET @tmp = NEW.item_b_id;
SET NEW.item_b_id = NEW.item_a_id;
SET NEW.item_a_id = @tmp;
END IF;
END;
|
CREATE TRIGGER ensure_a_b_before_update BEFORE UPDATE ON item_links
FOR EACH ROW
BEGIN
IF NEW.item_a_id > NEW.item_b_id THEN
SET @tmp = NEW.item_b_id;
SET NEW.item_b_id = NEW.item_a_id;
SET NEW.item_a_id = @tmp;
END IF;
END;
|
DELIMITER ;
은 내가 가진 무엇 :
mysql> INSERT INTO `item_links` (`item_a_id`, `item_b_id`, `value`)
-> VALUES ('1', '2', 'a')
-> , ('3', '2', 'b')
-> , ('4', '1', 'c');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM `item_links`;
+-----------+-----------+-------+
| item_a_id | item_b_id | value |
+-----------+-----------+-------+
| 1 | 2 | a |
| 2 | 3 | b |
| 1 | 4 | c |
+-----------+-----------+-------+
3 rows in set (0.00 sec)
업데이트 작업, 너무 :
mysql> UPDATE `item_links`
-> SET `item_a_id` = 100, `item_b_id` = 20
-> WHERE `item_a_id` = 1 AND `item_b_id` = 2;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM `item_links`;
+-----------+-----------+-------+
| item_a_id | item_b_id | value |
+-----------+-----------+-------+
| 20 | 100 | a |
| 2 | 3 | b |
| 1 | 4 | c |
+-----------+-----------+-------+
3 rows in set (0.00 sec)