2014-02-12 12 views
0

我有三個表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 

如何創建強制a.aID,c.cCode的唯一條件的CONSTRAINT?

+0

通過添加唯一約束使c.cCode唯一,a.aID將始終是唯一的,因爲它是主鍵 –

回答

0

如下您可以添加一個唯一約束:

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

但是,您不能強制約束跨表,這是它聽起來像你正在嘗試做的。

至於表A.aID,它的主鍵,它已經有一個唯一的約束。

0

如果您正在尋找對列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 
0

我找到了一種方法,使用索引視圖獲得我想要的(我認爲)。請評論這是否合適。到目前爲止,我的測試得出結論,它確實有效。

我創建了一個視圖與模式綁定加入c到一個(通過b)。 我創建了一個聚集索引來強制在aID和cCode上唯一。

這使我不需要在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