に順序を強制するには、私は次の表にitem_a_idとitem_b_idが複合主キーです複合主キー
item_a_id, item_b_id, value
を持っていると言います。私の例では、aとbとaは等価です。したがって、私はitem_a_id < item_b_idを確実にしたいと思います。明らかにアプリケーションロジックがこれを実行しますが、データベースも確実に行うための方法はありますか?
に順序を強制するには、私は次の表にitem_a_idとitem_b_idが複合主キーです複合主キー
item_a_id, item_b_id, value
を持っていると言います。私の例では、aとbとaは等価です。したがって、私はitem_a_id < item_b_idを確実にしたいと思います。明らかにアプリケーションロジックがこれを実行しますが、データベースも確実に行うための方法はありますか?
適度なバージョンのMySqlでは、目的の動作をもたらすemulate a check constraintにトリガーを使用できます。
あなたのケースでは、挿入/更新前に値をチェックしてスワップすると、item_a_id
が常にitem_b_id
未満になるようにすることができます。テーブル名がitem_links
で、あなたはこの試みることができると仮定すると、
:
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)
を
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 ;
は、ここで私は挿入テストするとき、私が得たものです