2014-01-19 3 views
0

я получил две таблицы, как это:Ограничение вставки/обновления, если значение существует в другой таблице

ips(ip PRIMARY KEY, device) 
users_have_ips(user, ip FOREIGN KEY REFERENCES ips) 

IP-может принадлежать либо к устройству или пользователю. Поэтому я должен проверить, что ip не принадлежит пользователю при обновлении ips.device. Аналогом является проверка того, что ip не принадлежит устройству при обновлении/вставке users_have_ips.

Я бы попытаться решить это с помощью следующего мета-код:

CREATE TRIGGER tr_ips_ip4device 
BEFORE UPDATE ON ips 
FOR EACH ROW 
BEGIN 
    IF NEW.device IS NOT NULL 
      AND NEW.ip IN (SELECT ip FROM users_have_ips) 
    THEN 
     RESTRICT -- with message "ip already belongs to an user" 
    END IF; 
END 

CREATE TRIGGER tr_users_have_ips_freeip 
BEFORE INSERT+UPDATE ON users_have_ips 
FOR EACH ROW 
BEGIN 
    IF NEW.ip IN (SELECT ip FROM ips WHERE device IS NOT NULL) 
    THEN 
     RESTRICT -- with message "ip already belongs to an device" 
    END IF; 
END 

Основная проблема у меня есть Ограничить. Как я могу отменить изменения, например, при неправильных внешних ключах? Другой - инструкция SELECT в триггерах.

Есть ли лучший способ (возможно, без триггеров), чтобы решить эту проблему?

ответ

0

Я думаю, вы могли бы использовать ROLLBACK вместо RESTRICT.

+0

Не работает. – Chickenmarkus

Смежные вопросы