简体   繁体   English

不同表上列的唯一约束

[英]UNIQUE Constraint For Columns On Different Tables

I have three tables a,b,and c each with an int IDENTITY PK field that relates to the child table. 我有三个表a,b和c,每个表都有一个与子表相关的int IDENTITY PK字段。

    CREATE TABLE [dbo].[a]([aID] [int] IDENTITY(1,1) NOT NULL,[aCode] [varchar](20) NOT NULL,
    CONSTRAINT [PK_a] PRIMARY KEY CLUSTERED([aID] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]
    GO
    CREATE TABLE [dbo].[b]([bID] [int] IDENTITY(1,1) NOT NULL,[aID] [int] NOT NULL, [bCode] [varchar](20) NOT NULL,
    CONSTRAINT [PK_b] PRIMARY KEY CLUSTERED([bID] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]
    GO
    CREATE TABLE [dbo].[c]([cID] [int] IDENTITY(1,1) NOT NULL,[bID] [int] NOT NULL,[cCode] [varchar](20) NOT NULL,
    CONSTRAINT [PK_c] PRIMARY KEY CLUSTERED([cID] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[b]  WITH CHECK ADD  CONSTRAINT [FK_b_a] FOREIGN KEY([aID])
    REFERENCES [dbo].[a] ([aID])
    GO
    ALTER TABLE [dbo].[b] CHECK CONSTRAINT [FK_b_a]
    GO
    ALTER TABLE [dbo].[c]  WITH CHECK ADD  CONSTRAINT [FK_c_b] FOREIGN KEY([bID])
    REFERENCES [dbo].[b] ([bID])
    GO
    ALTER TABLE [dbo].[c] CHECK CONSTRAINT [FK_c_b]
    GO

How do I create a CONSTRAINT that enforces a unique condition for a.aID, c.cCode? 如何创建对a.aID,c.cCode实施唯一条件的CONSTRAINT?

You can add a unique constraint as follows: 您可以添加唯一约束,如下所示:

ALTER TABLE [C] ADD CONSTRAINT [uc_C_cCode] UNIQUE NONCLUSTERED [cCode];

You cannot however enforce a constraint across tables, which is what it sounds like you are trying to do. 但是,您不能在表之间强制执行约束,这听起来像是您要尝试执行的操作。

As for table A.aID, its a primary key, it will already have a unique constraint. 至于表A.aID(它是主键),它将已经具有唯一约束。

If you are looking for a unique constraint over a combination of columns a.aID, c.cCode one way is to alter table c and add [aid] column to it and have a composite unique key. 如果您要对a.aID, c.cCode列的组合寻求唯一约束a.aID, c.cCode一种方法是更改​​表c并向其中添加[aid]列,并使用复合唯一键。

 ALTER TABLE [dbo].[c](
 [cID] [int] IDENTITY(1,1) NOT NULL,
 [bID] [int] NOT NULL,[cCode] [varchar](20) NOT NULL,
 [cCode] [varchar](20) NOT NULL,
 [aID] INT FOREIGN KEY REFERENCES [a]([aID]) NOT NULL,
 CONSTRAINT uq_cCode_aid UNIQUE NONCLUSTERED (cCode,aID),
 CONSTRAINT [PK_c] PRIMARY KEY CLUSTERED([cID] ASC)
 WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
 ON 
[PRIMARY]) ON [PRIMARY]
GO

I found a way to get what I wanted (I think) using an indexed view. 我找到了一种使用索引视图获得所需(我认为)的方法。 Please comment on if this seems appropriate. 如果合适,请发表评论。 My tests so far conclude that it does work. 到目前为止,我的测试得出的结论是它确实有效。

I created a view with schemabinding on joining c to a (going through b). 我在将c连接到a(通过b)时创建了具有模式绑定的视图。 I created an clustered index to enforce unique on aID and cCode. 我创建了一个聚集索引来强制aID和cCode唯一。

This allows me to not need to include aID within the c table but still enforces the unique constraint. 这使我不必在c表中包含aID,但仍会强制执行唯一约束。

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE VIEW [dbo].[vw.aIDcCode] WITH SCHEMABINDING 
    AS
    SELECT     dbo.a.aID, dbo.c.cCode
    FROM         dbo.a 
                 INNER JOIN
                     dbo.b ON dbo.a.aID = dbo.b.aID
                         INNER JOIN
                             dbo.c ON dbo.b.bID = dbo.c.bID
    GO
    SET ARITHABORT ON
    GO
    SET CONCAT_NULL_YIELDS_NULL ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO
    SET ANSI_PADDING ON
    GO
    SET ANSI_WARNINGS ON
    GO
    SET NUMERIC_ROUNDABORT OFF
    GO
    CREATE UNIQUE CLUSTERED INDEX [IDX_Unique_aIDcCode] ON [dbo].[vw.aIDcCode] 
    ([aID] ASC, [cCode] ASC)
    WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
    ON [PRIMARY]
    GO

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM