2014-02-12 4 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 

Как создать CONSTRAINT, обеспечивающий уникальное условие для a.aID, c.cCode?

+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 и добавить к ней столбец [help] и создать составной уникальный ключ.

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

Я нашел способ получить то, что я хотел (я думаю), используя индексированный вид. Просьба прокомментировать, если это кажется уместным. До сих пор мои тесты заключают, что они действительно работают.

Я создал представление с schemabinding при присоединении c к (через b). Я создал кластеризованный индекс для обеспечения уникальности в aID и cCode.

Это позволяет мне не включать aID в таблицу c, но по-прежнему применяет уникальное ограничение.

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 
Смежные вопросы