1

Вот мой сценарий на SQL Server 2008 R2:Как я могу заставить один к одному отношения на SQL Server 2008 или 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? Должен ли я использовать контрольные ограничения?

ответ

3

Добавить уникальное ограничение в размере 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

Это имеет большой смысл. Одна вещь, на мой взгляд, заключается в том, что существует действительно один-один термин отношения или нет. Скажем, я использую инструмент ORM и читаю схему БД. будет ли инструмент ORM видеть это от одного к одному? Я знаю, что это зависит от инструмента, но есть ли здравый смысл? – tugberk

+0

@tugberk: Я видел, что Hibernate создает дополнительные таблицы, которые не нужны. Здравый смысл заключается в определении модели/дизайна в базе данных независимо от того, что говорит ORM. Но это мое мнение как парень базы данных :) – gbn

0

Вы можете держать Identity column(BarID) также. Тогда Unique key поможет вам решить эту проблему.

IF NOT EXISTS(SELECT OBJECT_ID from sys.objects WHERE name ='foo_bars') 
alter table bars add constraint foo_bars unique(fooid)