SQL Server - вставка нескольких значений в столбец - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь обновить свою пиццу, чтобы она позволила более одного пополнения.Я получаю сообщение об ошибке Cannot insert duplicate key row in object 'dbo.PizzaToppings' with unique index 'FK_Pizza'. The duplicate key value is (3). при попытке добавить более одного идентификатора toppingID в столбец.Как добавить несколько идентификаторов ToppingID?

INSERT INTO dbo.PizzaToppings
(PizzaToppingsID, PizzaID, ToppingsID)
VALUES 
   (1, 1, 1),
   (2, 2, 2),
   (3, 3, 3),
   (4, 4, 7),
   (5, 5, 6),
   (6, 6, 4),
   (7, 3, 7);

Созданная пицца FK_Pizza

CREATE UNIQUE NONCLUSTERED INDEX
FK_Pizza
ON PizzaToppings
(
PizzaID ASC
);

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Каждая пицца должна быть уникальной ..... Попробуйте это:

CREATE UNIQUE NONCLUSTERED INDEX
FK_Pizza
ON PizzaToppings
(
PizzaID ASC, ToppingsID ASC
);

Не забудьте сначала снять ограничение

0 голосов
/ 20 ноября 2018

Почему этот кластерный индекс назван как ограничение внешнего ключа?

CREATE UNIQUE NONCLUSTERED INDEX
FK_Pizza
ON PizzaToppings
(
PizzaID ASC
);

Должен ли он быть уникальным?Разве вы не имеете в виду, что это просто FK, а не индекс?

Разве ваш уникальный ключ не должен быть PizzaToppingID?

Вы разрешаете вставку идентификатора?Или вы не должны позволить, чтобы это был автоинкрементный идентификатор и просто вставить PizzaID и ToppingID?

Также есть ли уже запись с PizzaID = 3 уже в этой таблице?Если вы хотите просто поддержать или UPSERT, то разве MERGE не должен быть лучше?

Если это таблица соединений между пиццей и топпингом, чтобы показать, какие топпинги разрешены для какой пиццы, не так лиесть 2 ФК и 1 уникальный индекс?

0 голосов
/ 20 ноября 2018

Вы пытаетесь сохранить массив в виде столбца с номером.

Обычно у вас будет строка для каждого отдельного начинки:

Pizzas:
PizzaID     integer
PizzaName   varchar(32)

Toppings:
ToppingID   integer
ToppingName varchar(32)

PizzaTopping:
PizzaID     integer (fk to Pizzas.PizzaID)
ToppingID   integer (fk to Toppings.ToppingID)

PizzaTopping будет содержатьстрока для каждого начинки для пиццы.

Редактировать для обновленного вопроса:

Ваша ошибка связана с нарушением дублированного ключа.Проверьте ограничения в таблице, похоже, есть ограничение, которое не позволяет добавлять более одной строки на pizzaID

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