2013-06-19 2 views
1

У меня есть две таблицы.Как сделать два внешних ключа уникальными?

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

Немного хакерский способ сделать это, используя триггер.

Структура таблицы:

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;