1

私は2つのテーブルを持っています。

MY_ENTITY
----------------------------------------------------
ID               BIGINT                (PK)
YOUR_ENTITY_ID_1 BIGINT    NOT NULL    (FK) OneToOne ||--|
YOUR_ENTITY_ID_2 BIGINT        NULL    (FK) OneToOne ||--|
                                                         |
YOUR_ENTITY                                              |
----------------------------------------------------     |
ID               BIGINT                (PK) -------------|

YOUR_ENTITY_ID_X各列を一意にすることができると思います。

YOUR_ENTITYすべてのYOUR_ENTITY_ID_X列に 1 つだけ存在するようにするにはどうすればよいですか?

4

1 に答える 1

1

トリガーを使用して、これを行う少しハックな方法。

テーブル構造:

CREATE TABLE MY_ENTITY (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    ENTITY_ID_1 INT UNSIGNED UNIQUE,
    ENTITY_ID_2 INT UNSIGNED UNIQUE,
    UNIQUE(ENTITY_ID_1, ENTITY_ID_2)
);

挿入を防止するトリガー:

DROP TRIGGER IF EXISTS ONLY_UNIQUE_ENTITIES;
DELIMITER //
CREATE TRIGGER ONLY_UNIQUE_ENTITIES BEFORE INSERT ON `MY_ENTITY`
FOR EACH ROW
BEGIN
    DECLARE entity_exists INT DEFAULT 0;
    SELECT 
        COUNT(*) INTO entity_exists
    FROM 
        `MY_ENTITY` 
    WHERE 
        (`ENTITY_ID_1` IN (NEW.ENTITY_ID_1, NEW.ENTITY_ID_2)) 
      OR
        (`ENTITY_ID_2` IN (NEW.ENTITY_ID_1, NEW.ENTITY_ID_2));
    IF entity_exists THEN
        SET NEW.ENTITY_ID_1 = NEW.ENTITY_ID_2;
    END IF;     
END;
于 2013-06-19T04:38:49.060 に答える