Составной первичный ключ с отношениями внешнего ключа к нескольким таблицам.Ошибки SQL Server 2008 - PullRequest
1 голос
/ 21 августа 2010
USE [Fk_Test2]
GO

/****** Object:  Table [dbo].[Owners]    Script Date: 08/20/2010 16:52:44 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Owners](
    [Owner] [varchar](10) NOT NULL,
 CONSTRAINT [PK_Owners] PRIMARY KEY CLUSTERED 
(
    [Owner] 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

SET ANSI_PADDING OFF
GO


/****** Object:  Table [dbo].[Key]    Script Date: 08/20/2010 16:49:57 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Key](
    [owner] [varchar](10) NOT NULL,
    [key_id] [varchar](10) NOT NULL,
    [description] [varchar](10) NOT NULL,
 CONSTRAINT [PK_Key] PRIMARY KEY CLUSTERED 
(
    [owner] ASC,
    [key_id] 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

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Key]  WITH CHECK ADD  CONSTRAINT [FK_Key_Owners] FOREIGN KEY([owner])
REFERENCES [dbo].[Owners] ([Owner])
GO

ALTER TABLE [dbo].[Key] CHECK CONSTRAINT [FK_Key_Owners]
GO



/****** Object:  Table [dbo].[Bldg]    Script Date: 08/20/2010 16:50:29 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Bldg](
    [bldg] [varchar](10) NOT NULL,
    [owner] [varchar](10) NOT NULL,
 CONSTRAINT [PK_Bldg] PRIMARY KEY CLUSTERED 
(
    [bldg] ASC,
    [owner] 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

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Bldg]  WITH CHECK ADD  CONSTRAINT [FK_Bldg_Owners] FOREIGN KEY([owner])
REFERENCES [dbo].[Owners] ([Owner])
GO

ALTER TABLE [dbo].[Bldg] CHECK CONSTRAINT [FK_Bldg_Owners]
GO


/****** Object:  Table [dbo].[KeyToBuilding]    Script Date: 08/20/2010 17:13:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[KeyToBuilding](
    [owner] [varchar](10) NOT NULL,
    [bldg] [varchar](10) NOT NULL,
    [key_id] [varchar](10) NOT NULL,
 CONSTRAINT [PK_KeyToBuilding] PRIMARY KEY CLUSTERED 
(
    [owner] ASC,
    [bldg] ASC,
    [key_id] 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

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[KeyToBuilding]  WITH CHECK ADD  CONSTRAINT [FK_KeyToBuilding_Key] FOREIGN KEY([owner], [key_id])
REFERENCES [dbo].[Key] ([owner], [key_id])
GO

ALTER TABLE [dbo].[KeyToBuilding] CHECK CONSTRAINT [FK_KeyToBuilding_Key]
GO

ALTER TABLE [dbo].[KeyToBuilding]  WITH CHECK ADD  CONSTRAINT [FK_KeyToBuilding_Bldg] FOREIGN KEY([owner], [bldg])
REFERENCES [dbo].[Bldg] ([owner], [bldg])
GO

ALTER TABLE [dbo].[KeyToBuilding] CHECK CONSTRAINT [FK_KeyToBuilding_Bldg]
GO

Всякий раз, когда я пытаюсь настроить это, я получаю сообщение об ошибке "Столбцы в таблице" Ключ "или" Bldg "не соответствуют существующему первичному ключу или уникальному ограничению.

Я пытаюсь реализовать эти отношения неправильно? или делать что-то тупое?

Система предназначена для отслеживания ключей (физических) людей к различным зданиям. Вот почему есть key_id и Key, они не являются ключами базы данных.

Ответы [ 2 ]

2 голосов
/ 21 августа 2010

Это источник синтаксической ошибки;

первичный ключ в таблице Bldg:

CONSTRAINT [PK_Bldg] PRIMARY KEY ([bldg], [owner])

А в таблице KeyToBuilding, [FK_KeyToBuilding_Bldg] вы пытаетесьссылка ([owner], [bldg]) вместо ([bldg], [owner])

Помогает, если вы просто немного очистите код, следующее выполняется нормально:

CREATE TABLE [dbo].[Owners]
  ( 
   [Owner] [varchar](10) NOT NULL
  ,CONSTRAINT [PK_Owners] PRIMARY KEY CLUSTERED ([Owner])
  ) ;

CREATE TABLE [dbo].[Key]
  ( 
   [owner] [varchar](10) NOT NULL
  ,[key_id] [varchar](10) NOT NULL
  ,[description] [varchar](10) NOT NULL
  ,CONSTRAINT [PK_Key] PRIMARY KEY CLUSTERED ([owner], [key_id])
  ) ;
ALTER TABLE [dbo].[Key] ADD  CONSTRAINT [FK_Key_Owners] FOREIGN KEY([owner]) REFERENCES [dbo].[Owners] ([Owner])  ;

CREATE TABLE [dbo].[Bldg]
  ( 
   [bldg] [varchar](10) NOT NULL
  ,[owner] [varchar](10) NOT NULL
  ,CONSTRAINT [PK_Bldg] PRIMARY KEY CLUSTERED ( [bldg], [owner] )
  ) ;
ALTER TABLE [dbo].[Bldg] ADD CONSTRAINT [FK_Bldg_Owners] FOREIGN KEY([owner]) REFERENCES [dbo].[Owners] ([Owner]);

CREATE TABLE [dbo].[KeyToBuilding]
  ( 
   [owner] [varchar](10) NOT NULL
  ,[bldg] [varchar](10) NOT NULL
  ,[key_id] [varchar](10) NOT NULL
  ,CONSTRAINT [PK_KeyToBuilding] PRIMARY KEY CLUSTERED ([owner], [bldg], [key_id])
  );

ALTER TABLE [dbo].[KeyToBuilding] ADD
  CONSTRAINT [FK_KeyToBuilding_Key]  FOREIGN KEY([owner], [key_id]) REFERENCES [dbo].[Key] ([owner], [key_id])
, CONSTRAINT [FK_KeyToBuilding_Bldg] FOREIGN KEY([bldg], [owner])   REFERENCES [dbo].[Bldg] ([bldg], [owner]) ;

Теперь о модели - я делаюЯ не совсем понимаю, но если бы я хотел отслеживать людей, ключи и здания, это бы:

alt text

Модель выше не отслеживает владельцев зданий, поэтому BuildingOwner таблица добавлена.

  • Человек может владеть несколькими зданиями.
  • Здание может принадлежать нескольким людям (товарищество).

alt text

Ключ также может иметь владельца, не обязательно того, кто имеет ключ в данный момент.

  • Ключ может открыть одно здание, одно здание может быть открыто многими ключами.
  • Ключ имеет владельца.
  • Ключ удерживается владельцем ключа, который может быть, а может и не быть владельцем ключа.

alt text

0 голосов
/ 21 августа 2010

Вы должны быть в состоянии создать их, какой метод вы используете для создания отношений, которые дают вам ошибку?

Возможно, вы создаете их задом наперед.

Также проверьте, есть ли противоречивые данные в таблицах. Все строки в KeyToBuilding должны быть в Bldg и Key, прежде чем вы сможете создать отношение FK. Проще всего создать отношения, когда все 3 таблицы пусты из строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...