2016-08-29 4 views
0

В моей работе, проверяя диаграммы базы данных, я нашел связь «один-к-одному» между двумя таблицами, но отношение не находится между двумя первичными ключами, между первичным ключом в одной таблице и другим атрибутом не первичного ключа в другой таблице. В диаграммах базы данных отображаются как отношения «один к одному». Интересно, как я могу создать такие отношения «один к одному», используя только одну первичную на одной таблице и используя не первичный ключ в другой таблице.Создание отношения «один-к-одному» с использованием только одного первичного ключа

enter image description here

Вот скрипты для «создания», что я нашел в базе данных

--------------- Для создания таблицы Agreement Документы --- -----------

CREATE TABLE [dbo].[AgreementDocuments](
    [AgreementDocumentID] [int] IDENTITY(1,1) NOT NULL, 
    [AgreementID] [int] NOT NULL, 
    [Document] [varbinary](max) NOT NULL, 
CONSTRAINT [PK_AgreementDocuments] PRIMARY KEY CLUSTERED 
([AgreementDocumentID] ASC) WITH (PAD_INDEX = OFF, 
STATISTICS_NORECOMPUTE = OFF, 
IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, 
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
ALTER TABLE [dbo].[AgreementDocuments] WITH CHECK ADD CONSTRAINT  
[FK_AgreementDocuments_Agreements] FOREIGN KEY([AgreementID]) 
REFERENCES [dbo].[Agreements] ([AgreementID])  
GO 
ALTER TABLE [dbo].[AgreementDocuments] CHECK CONSTRAINT 
[FK_AgreementDocuments_Agreements] 
GO 

-------------------------- Создать таблицу соглашений - ---------------------

CREATE TABLE [dbo].[Agreements](
[AgreementID] [int] IDENTITY(1,1) NOT NULL, 
[ContactID] [int] NOT NULL, 
[ClientID] [int] NOT NULL, 
CONSTRAINT [PK_Agreements] PRIMARY KEY CLUSTERED 
([AgreementID] 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 

Если я запустил эти два запроса в отдельной базе данных, он создает две таблицы с отношением «Один ко многим». Как это возможно?

ответ

1

Вы можете сделать это отношение один-к-одному, добавляя UNIQUE CONSTRAINT к AgreementID поле:

ALTER TABLE dbo.AgreementDocuments 
ADD CONSTRAINT uq_AgreementDocuments_AgreementId UNIQUE (AgreementId) 

С уникального ограничения, это заставит его быть один-к-одному, а чем один-ко-многим:

Перед Constraint:

enter image description here

После Constraint:

enter image description here

+1

Он работает, большое спасибо! – Aben

+0

С помощью этого решения есть ли какие-либо основания для сохранения поля 'СоглашениеDocumentID'? Может ли столбец «СоглашениеID» действовать как PK, FK и Identity для таблицы «СоглашениеDocuments»? – Nitax

0

Создать таблицу один с идентификационным колонке ID. СоглашениеDocumentID является тождественным и отличным

В другой таблице введите внешний ключ в поле первого поля AgreementDocumentID. А затем добавьте отдельный индекс во вторую таблицу для DocumentDocumentID.

Если я понимаю ваш вопрос.

Инструмент Er-Digram не работает 100%, вам нужно отредактировать то, что они создают, чтобы сделать его правильным. В зависимости от качества инструмента изменяется количество изменений.