Как я могу навязать отношения один к одному на SQL Server 2008 или 2008 R2 - PullRequest
1 голос
/ 26 января 2012

Вот мой сценарий на SQL Server 2008 R2 :

Это мой первый стол:

CREATE TABLE [dbo].[Foos](
    [FooId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
 CONSTRAINT [PK_Foos] PRIMARY KEY CLUSTERED 
  (
    [FooId] ASC
  )
) ON [PRIMARY]

Это вторая таблица, которая имеет отношение к Foos таблице:

CREATE TABLE [dbo].[Bars](
    [BarId] [int] IDENTITY(1,1) NOT NULL,
    [FooId] [int] NOT NULL,
    [Name] [nvarchar](50) NULL,
 CONSTRAINT [PK_Bars] PRIMARY KEY CLUSTERED 
  (
    [BarId] ASC
  )
) ON [PRIMARY]

Go

ALTER TABLE [dbo].[Bars]  WITH CHECK ADD  CONSTRAINT [FK_Bars_Foos] FOREIGN KEY([FooId])
REFERENCES [dbo].[Foos] ([FooId])
ON DELETE CASCADE
GO

Но это не один к одному. Что я должен сделать, чтобы заставить это быть one to one отношениями? Должен ли я использовать проверочные ограничения?

Ответы [ 2 ]

3 голосов
/ 26 января 2012

Добавить уникальное ограничение к FooId в Bars.

Однако вам не нужно BarID, потому что они имеют одинаковый ключ.Вот так это выглядит

CREATE TABLE [dbo].[Bars] (
    [FooId] [int] NOT NULL,
    [Name] [nvarchar](50) NULL,

    CONSTRAINT [PK_Bars] PRIMARY KEY CLUSTERED (FooId),

    CONSTRAINT [FK_Bars_Foos] FOREIGN KEY([FooId]) 
           REFERENCES [dbo].[Foos] ([FooId])
           ON DELETE CASCADE
)
GO

Однако, опять же, вам вообще не нужно Bars: это одна таблица ...

0 голосов
/ 26 января 2012

Вы также можете сохранить Identity column(BarID). Тогда Уникальный ключ поможет вам справиться с этой проблемой.

   IF NOT EXISTS(SELECT OBJECT_ID from sys.objects WHERE name ='foo_bars')
alter table bars add constraint foo_bars unique(fooid)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...