首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >约束:来自另一个表中列的数据

约束:来自另一个表中列的数据
EN

Stack Overflow用户
提问于 2014-07-09 08:33:53
回答 2查看 242关注 0票数 1

我使用,并希望添加一个约束检查来自Table1的列中的数据是否存在于来自Table2的另一列中(但两者并不是唯一的)。

代码语言:javascript
运行
复制
Table1   | Table2
--------------------
ColX        ColY 
  A      |   A        //Ok
  A      |   A        //Ok
  B      |   A        //Ok
  B      |   B        //Ok
  C      |   D        //Impossbile by the constraint

有可能做这样的事吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-09 09:09:10

不幸的是,Server不允许您为非唯一列创建FOREIGN KEY

您可以创建一个触发器,该触发器将使用该列的唯一值填充辅助表,并为该表设置一个外键:

代码语言:javascript
运行
复制
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

然后为那个表做一个外键:

代码语言:javascript
运行
复制
ALTER TABLE
        Table2
ADD CONSTRAINT
        FK_Table2_ColX__Table1_ColY
FOREIGN KEY
        (colX)
REFERENCES
        Table1 (colY)
GO
票数 2
EN

Stack Overflow用户

发布于 2014-07-09 08:51:03

是的,这叫外键。

foreignkey.asp

代码语言:javascript
运行
复制
ALTER TABLE Table1
ADD CONSTRAINT FK_Name
FOREIGN KEY (ColX) REFERENCES Table2(ColY)

Edit1: Dang,对,这就是我在早上喝咖啡之前做任何事情的原因。这是你的嗜好。让我想一想:)

Edit2: --好吧,我认为在不改变结构的情况下,唯一能做到这一点的方法是在Check约束中使用和UDF:

代码语言:javascript
运行
复制
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引用它。

但是最好的解决方案取决于您的需求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24648874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档