2014-07-09 29 views
1

我使用SQL Management Studio,我想添加一個約束來檢查來自Table1的列中的數據是否存在於Table2的另一列中(但兩者不是唯一的)。約束SQL管理工作室:來自另一個表中存在的列的數據

Table1 | Table2 
-------------------- 
ColX  ColY 
    A  | A  //Ok 
    A  | A  //Ok 
    B  | A  //Ok 
    B  | B  //Ok 
    C  | D  //Impossbile by the constraint 

是否有可能做這樣的事情?

+0

你的意思是'外鍵'? – Prisoner

+0

你想在table1或表2中插入值時檢查這個嗎? – Yogesh

+0

@Alex:不得不比較你的用戶ID,以確保你不是在和自己說話! – Quassnoi

回答

2

不幸的是,SQL Server不會讓你創建一個非唯一列的FOREIGN KEY

您可以觸發這將填充列的唯一值的輔助表,並進行了外鍵,它表:

CREATE TABLE 
     Table1_Y 
     (
     colY VARCHAR(20) NOT NULL PRIMARY KEY, 
     cnt BIGINT NOT NULL 
     ) 
GO 

CREATE TRIGGER 
     TR_Table1_All 
ON  Table1 
AFTER INSERT, UPDATE, DELETE 
AS 
MERGE 
INTO Table1_Y t 
USING (
     SELECT colY, SUM(cnt) 
     FROM (
       SELECT colY, 1 
       FROM INSERTED 
       UNION ALL 
       SELECT colY, -1 
       FROM DELETED 
       ) q (colY, cnt) 
     ) s (colY, сте) 
ON  t.colY = s.colY 
WHEN MATCHED AND t.cnt - s.cnt <= 0 THEN 
DELETE 
WHEN MATCHED THEN 
UPDATE 
SET  t.cnt = t.cnt + s.cnt 
WHEN NOT MATCHED BY TARGET AND s.cnt > 0 THEN 
INSERT (colY, cnt) 
VALUES (s.colY, s.cnt); 
GO 

然後做一個外鍵,它表:

ALTER TABLE 
     Table2 
ADD CONSTRAINT 
     FK_Table2_ColX__Table1_ColY 
FOREIGN KEY 
     (colX) 
REFERENCES 
     Table1 (colY) 
GO 
1

是的,它被稱爲外鍵

http://www.w3schools.com/sql/sql_foreignkey.asp

ALTER TABLE Table1 
ADD CONSTRAINT FK_Name 
FOREIGN KEY (ColX) REFERENCES Table2(ColY) 

EDIT1: 黨,正確的,我是這麼得到嘗試做任何事情之前,我有我的早晨咖啡。這對你來說上癮。讓我想想:)

EDIT2: 所以,不要緊,我覺得這樣做沒有結構的變化的唯一途徑是使用和UDF在檢查約束:

create function myudf(@id int) 
returns bit 
as 
begin 
    return coalesce((select top 1 1 from Table2 where ColY = @id),0) 
end 

ALTER TABLE Table1 
ADD CONSTRAINT FK_table2_ColX CHECK (dbo.myudf(ColX) = 1) 

另一種方法是添加一個新的表格,其中ColY將是PK,而Table2和Table1都將由FK引用它。

但最好的解決方案取決於您的要求。

+0

感謝您的回答,這是我嘗試的第一件事,但來自table2的ColY不是唯一的,因此當我嘗試 – Alex

+0

時,彈出錯誤消息明確提到,列是獨一無二的。 – Quassnoi

+1

請注意,檢查約束不會在DML上針對另一個表進行檢查,所以如果有人從'Table2'刪除或更新最後引用的記錄,則會在'Table1'中留下一個孤兒行。 – Quassnoi

相關問題