我希望表中的列具有受限域,该域列在不同的表中。通常,我只是这样做:
ALTER TABLE Table1
ADD CONSTRAINT FK_Especialidade FOREIGN KEY (column1)
REFERENCES Table2
但是,“column1”必须引用的值不应该是Table2中的主键。有什么建议吗?
答案 0 :(得分:1)
你可以使用一个触发器(这是我的头脑,语法可能不正确......)
CREATE TRIGGER MyTrigger ON Table1 FOR INSERT, UPDATE
AS
IF UPDATE(column1)
BEGIN
IF NOT EXIST (SELECT column2 FROM Table2 WHERE column2 = column1)
RAISERROR ('Invalid column1 value.', 16, 1)
END
END
确保你至少在表2中的column2上有一个索引,你希望你的触发器尽快执行!
答案 1 :(得分:0)
触发器怎么样?
答案 2 :(得分:0)
外键可以引用目标表中的任何UNIQUE约束,而不仅仅是主键。
CREATE TABLE foo (
foo_id INT PRIMARY KEY,
some_attribute INT,
UNIQUE KEY (some_attribute)
);
CREATE TABLE bar (
bar_id INT PRIMARY KEY,
some_attribute INT,
FOREIGN KEY (some_attribute) REFERENCES foo (some_attribute)
);
答案 3 :(得分:0)
你只添加了一个'SQL'标签,所以这里有一些有效的完整SQL-92:
ALTER TABLE Table1
ADD CONSTRAINT ck_Especialidade
CHECK (
EXISTS (
SELECT *
FROM Table2
WHERE Table2.column1 = Table1.column1
)
);
当然,并非所有SQL产品都实现了这个完整的SQL-92功能(例如,SQL Server没有......),尽管可能存在一种解决方法(例如,采用用户定义的功能)。无论如何,为什么重新发明轮子?