Проблема с настройкой внешнего ключа - PullRequest
0 голосов
/ 16 июля 2010

Я пытаюсь установить отношение внешнего ключа между таблицей Order_Items и таблицей Parts.Я хочу связать детали с продуктами в таблице Order_Items через внешний ключ.У меня нет проблем с другими таблицами.

Вот как определяется таблица Order_Items:

CREATE TABLE [dbo].[Order_Items](
    [order_id] [uniqueidentifier] NOT NULL,
    [product_number] [varchar](50) NOT NULL,
    [quantity_ordered] [int] NOT NULL,
    [product_tested] [bit] NULL,
 CONSTRAINT [PK_Order_Items] PRIMARY KEY CLUSTERED 
(
    [order_id] ASC,
    [product_number] 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].[Order_Items]  WITH CHECK ADD  CONSTRAINT [FK_Order_Items_Orders] FOREIGN KEY([order_id])
REFERENCES [dbo].[Orders] ([order_id])
GO
ALTER TABLE [dbo].[Order_Items] CHECK CONSTRAINT [FK_Order_Items_Orders]

и таблица деталей:

CREATE TABLE [dbo].[Parts](
    [part_number] [varchar](50) NOT NULL,
    [product_number] [varchar](50) NOT NULL,
    [part_description] [varchar](max) NULL,
    [part_tested] [bit] NULL,
 CONSTRAINT [PK_Parts_1] PRIMARY KEY CLUSTERED 
(
    [part_number] ASC,
    [product_number] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Я пробовалустановка уникального ограничения для обоих столбцов product_number, но я все равно получаю сообщение об ошибке в SQL Server 2005 Management Studio Express как:

"The columns in table 'Order_Items' do not match an existing primary key or UNIQUE constraint"

Ответы [ 3 ]

3 голосов
/ 16 июля 2010

Вопрос: если [product_number] в вашей таблице Parts можно сделать уникальным с помощью уникального ограничения - почему это не первичный ключ сам по себе ??

Чувство моей интуиции: [product_number] inParts на самом деле не уникален - только комбинация (part_number, product_number), который является первичным ключом, действительно уникальна.

Если вы можете создать UNIQUE INDEX на *Один столбец 1013 *, вы должны иметь возможность создать ограничение FK - попробуйте это:

CREATE UNIQUE INDEX UIX01_Parts ON dbo.Parts(product_number)

ALTER TABLE dbo.Order_Items
  ADD CONSTRAINT FK_OrderITems_Parts
    FOREIGN KEY(product_number) REFERENCES dbo.Parts(product_number)

Это работает?Если нет - какую ошибку вы получите и где ??

Если это не сработает, и только (part_number, product_number) действительно уникален, то вам нужно сослаться на оба столбца в ограничении внешнего ключа:

ALTER TABLE dbo.Order_Items
  ADD CONSTRAINT FK_OrderItems_Parts
  FOREIGN KEY(part_number, product_number)
    REFERENCES dbo.Parts(part_number, product_number)

и, конечно, это также означает, что вам нужно иметь оба этих столбца в таблице Order_Items, чтобы иметь возможность работать с ограничением внешнего ключа.

Просто как сторонапримечание: наличие составного первичного ключа из двух VARCHAR(50) столбцов и создание кластеризованного индекса для вашей таблицы Parts не является оптимальным.Если возможно, попытайтесь сделать одно или оба из этих «чисел» действительно числовым типом - например, столбец INT.Или, если это невозможно, подумайте о наличии суррогатного столбца PartID (INT, IDENTITY) в вашей таблице Parts - это также облегчит ограничение FK!

2 голосов
/ 16 июля 2010

Чтобы это отношение работало, таблица деталей не может иметь составной ключ.Другими словами, вам нужно использовать product_number в качестве первичного ключа, так как это столбец, который у них обоих общий.В настоящее время у вас есть part_number и product_number в качестве первичного ключа.

Как только вы сделаете это изменение, этот оператор будет работать:

ALTER TABLE [dbo].[Order_Items]  WITH CHECK 
ADD  CONSTRAINT [FK_Order_Items_Parts] FOREIGN KEY([product_number])
REFERENCES [dbo].[Parts] ([product_number])
0 голосов
/ 29 июля 2010

Я закончил реструктуризацию всей своей базы данных, чтобы это заработало, и упростил соединения с таблицами.

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