我有两张这样的桌子:
ips(ip PRIMARY KEY, device)
users_have_ips(user, ip FOREIGN KEY REFERENCES ips)
ip可以属于设备或用户。所以在更新ips.device时我必须检查ip不属于用户。模拟有更新/插入users_have_ips时检查ip不属于设备。
我会尝试使用以下元代码解决此问题:
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
我遇到的主要问题是RESTRICT。如何在不正确的外键上中止更改?另一个是触发器中的SELECT语句。
有没有更好的方法(可能没有触发器)来解决这个问题?
答案 0 :(得分:0)
我认为您可能意味着使用ROLLBACK而不是RESTRICT。