我使用,并希望添加一个约束检查来自Table1的列中的数据是否存在于来自Table2的另一列中(但两者并不是唯一的)。
Table1 | Table2
--------------------
ColX ColY
A | A //Ok
A | A //Ok
B | A //Ok
B | B //Ok
C | D //Impossbile by the constraint有可能做这样的事吗?
发布于 2014-07-09 09:09:10
不幸的是,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发布于 2014-07-09 08:51:03
是的,这叫外键。
foreignkey.asp
ALTER TABLE Table1
ADD CONSTRAINT FK_Name
FOREIGN KEY (ColX) REFERENCES Table2(ColY)Edit1: Dang,对,这就是我在早上喝咖啡之前做任何事情的原因。这是你的嗜好。让我想一想:)
Edit2: --好吧,我认为在不改变结构的情况下,唯一能做到这一点的方法是在Check约束中使用和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引用它。
但是最好的解决方案取决于您的需求。
https://stackoverflow.com/questions/24648874
复制相似问题