簡體   English   中英

SQL:有沒有一種方法可以對照其他表中的列值而不使用外鍵來驗證列中的值?

[英]SQL: Is there a way to validate the value from a column against the value from a column in a different table NOT using Foreign Key?

我希望表中的列具有有限的域,該域在其他表中列出。 通常,我只是這樣做:

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

但是,“ column1”必須引用的值不應是表2中的主鍵。 有什么建議么?

您可以使用觸發器(這不在我的腦海中,語法可能不正確...)

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上有一個索引,您希望觸發器盡快執行!

觸發器如何?

外鍵可以引用目標表中的任何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) 
);

您只添加了“ 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不能...),盡管可能有解決方法(例如,使用用戶定義的函數)。 無論如何,為什么要重新發明輪子?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM