SQL:有没有办法验证列中的值与不使用外键的不同表中的列的值?

时间:2010-06-29 23:27:59

标签: sql

我希望表中的列具有受限域,该域列在不同的表中。通常,我只是这样做:

ALTER TABLE Table1
ADD CONSTRAINT FK_Especialidade FOREIGN KEY (column1)
REFERENCES Table2

但是,“column1”必须引用的值不应该是Table2中的主键。有什么建议吗?

4 个答案:

答案 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没有......),尽管可能存在一种解决方法(例如,采用用户定义的功能)。无论如何,为什么重新发明轮子?